You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by ca...@apache.org on 2017/08/03 17:25:11 UTC

[1/2] incubator-rya git commit: RYA-318 Rya Shell improvements for packaging, loading and querying.

Repository: incubator-rya
Updated Branches:
  refs/heads/master 65f6d478c -> fa2aad55f


http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/java/org/apache/rya/shell/util/JLinePrompt.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/org/apache/rya/shell/util/JLinePrompt.java b/extras/rya.console/src/main/java/org/apache/rya/shell/util/JLinePrompt.java
index c9403b0..a259593 100644
--- a/extras/rya.console/src/main/java/org/apache/rya/shell/util/JLinePrompt.java
+++ b/extras/rya.console/src/main/java/org/apache/rya/shell/util/JLinePrompt.java
@@ -23,9 +23,6 @@ import static java.util.Objects.requireNonNull;
 import java.io.IOException;
 import java.util.Set;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.util.FieldUtils;
 import org.springframework.shell.core.Shell;
@@ -33,6 +30,8 @@ import org.springframework.shell.core.Shell;
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
 
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
 import jline.console.ConsoleReader;
 
 /**
@@ -72,6 +71,17 @@ public abstract class JLinePrompt {
      * @return A prompt that shows the default value for a field.
      */
     public String makeFieldPrompt(final String fieldName, final boolean defaultValue) {
+    	return makeFieldPrompt(fieldName, Boolean.toString(defaultValue));
+    }
+
+    /**
+     * Formats a prompt that shows a default value.
+     *
+     * @param fieldName - The text portion that appears before the default. (not null)
+     * @param defaultValue - The default value that will be shown in the prompt.
+     * @return A prompt that shows the default value for a field.
+     */
+    public String makeFieldPrompt(final String fieldName, final String defaultValue) {
         return String.format("%s [default: %s]: ", fieldName, defaultValue);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/java/org/apache/rya/shell/util/SparqlPrompt.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/org/apache/rya/shell/util/SparqlPrompt.java b/extras/rya.console/src/main/java/org/apache/rya/shell/util/SparqlPrompt.java
index 97aefdd..2574eea 100644
--- a/extras/rya.console/src/main/java/org/apache/rya/shell/util/SparqlPrompt.java
+++ b/extras/rya.console/src/main/java/org/apache/rya/shell/util/SparqlPrompt.java
@@ -20,9 +20,10 @@ package org.apache.rya.shell.util;
 
 import java.io.IOException;
 
+import com.google.common.base.Optional;
+
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-
 import jline.console.ConsoleReader;
 
 /**
@@ -32,13 +33,12 @@ import jline.console.ConsoleReader;
 public interface SparqlPrompt {
 
     /**
-     * Prompt the user for a SPARQL query, wait for their input, and then get the
-     * value they entered.
+     * Prompt the user for a SPARQL query, wait for their input, and then get the value they entered.
      *
-     * @return The user entered SPARQL query.
-     * @throws IOEXception There was a problem reading the user's input.
+     * @return The user entered SPARQL query, or an empty string if the user aborts.
+     * @throws IOException There was a problem reading the user's input.
      */
-    public String getSparql() throws IOException;
+    public Optional<String> getSparql() throws IOException;
 
     /**
      * Prompts a user for a SPARQL query using a JLine {@link ConsoleReader}.
@@ -46,11 +46,37 @@ public interface SparqlPrompt {
     @DefaultAnnotation(NonNull.class)
     public static class JLineSparqlPrompt extends JLinePrompt implements SparqlPrompt {
 
+        private final String EXECUTE_COMMAND = "\\e";
+        private final String CLEAR_COMMAND = "\\c";
+
         @Override
-        public String getSparql() throws IOException {
+        public Optional<String> getSparql() throws IOException {
             final ConsoleReader reader = getReader();
-            reader.setPrompt("SPARQL: ");
-            return reader.readLine();
+            reader.setCopyPasteDetection(true); // disable tab completion from activating
+            reader.setHistoryEnabled(false);    // don't store SPARQL fragments in the command history
+            try {
+                reader.println("Enter a SPARQL Query.");
+                reader.println("Type '" + EXECUTE_COMMAND + "' to execute the current query.");
+                reader.println("Type '" + CLEAR_COMMAND + "' to clear the current query.");
+                reader.flush();
+
+                final StringBuilder sb = new StringBuilder();
+                String line = reader.readLine("SPARQL> ");
+                while (!line.endsWith(CLEAR_COMMAND) && !line.endsWith(EXECUTE_COMMAND)) {
+                    sb.append(line).append("\n");
+                    line = reader.readLine("     -> ");
+                }
+
+                if (line.endsWith(EXECUTE_COMMAND)) {
+                    sb.append(line.substring(0, line.length() - EXECUTE_COMMAND.length()));
+                    return Optional.of(sb.toString());
+                }
+                return Optional.absent();
+            } finally {
+                reader.setHistoryEnabled(true);      // restore the ConsoleReader's settings
+                reader.setCopyPasteDetection(false); // restore tab completion
+            }
         }
     }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/resources/META-INF/spring/spring-shell-plugin.xml
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/resources/META-INF/spring/spring-shell-plugin.xml b/extras/rya.console/src/main/resources/META-INF/spring/spring-shell-plugin.xml
index 02d9f4f..48c4846 100644
--- a/extras/rya.console/src/main/resources/META-INF/spring/spring-shell-plugin.xml
+++ b/extras/rya.console/src/main/resources/META-INF/spring/spring-shell-plugin.xml
@@ -32,9 +32,19 @@
     <bean id="sharedShellState" class="org.apache.rya.shell.SharedShellState" />
     <bean id="passwordPrompt" class="org.apache.rya.shell.util.PasswordPrompt.JLinePasswordPrompt" />
     <bean id="installPrompt" class="org.apache.rya.shell.util.InstallPrompt.JLineAccumuloInstallPrompt" />
+    <bean id="uninstallPrompt" class="org.apache.rya.shell.util.UninstallPrompt.JLineUninstallPrompt" />
     <bean id="sparqlPrompt" class="org.apache.rya.shell.util.SparqlPrompt.JLineSparqlPrompt" />
+    <bean id="consolePrinter" class="org.apache.rya.shell.util.ConsolePrinter.JLineConsolePrinter" />
     
     <!-- Define each of the beans that hold onto commands used by the shell. -->
     <bean id="ryaConnectionCommands" class="org.apache.rya.shell.RyaConnectionCommands" />
     <bean id="ryaAdminCommands" class="org.apache.rya.shell.RyaAdminCommands" />
+    <bean id="ryaCommands" class="org.apache.rya.shell.RyaCommands" />
+    
+    <!--  
+    <bean id="springHelpCommands" class="org.springframework.shell.commands.HelpCommands" />
+    <bean id="springScriptCommands" class="org.springframework.shell.commands.ScriptCommands" />
+    <bean id="springExitCommands" class="org.springframework.shell.commands.ExitCommands" />
+    -->
+    
 </beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/scripts/rya
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/scripts/rya b/extras/rya.console/src/main/scripts/rya
new file mode 100644
index 0000000..5280286
--- /dev/null
+++ b/extras/rya.console/src/main/scripts/rya
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+
+PROJECT_HOME=$(dirname $(cd $(dirname $0) && pwd))
+#cd $PROJECT_HOME
+
+java -cp $PROJECT_HOME/lib/${project.artifactId}-${project.version}-shaded.jar \
+  -Drya.shell.home="${PROJECT_HOME}/" \
+  -Dlog4j.configuration="file://$PROJECT_HOME/conf/log4j.properties" \
+  org.springframework.shell.Bootstrap "$@"
+  
+# --profiles - Specifies values for the system property spring.profiles.active so that Spring 3.1 and greater profile support is enabled.
+# --cmdfile - Specifies a file to read that contains shell commands
+# --histsize - Specifies the maximum number of lines to store in the command history file. Default value is 3000.
+# --disableInternalCommands - Flag that disables all commands that would be pre-registered with the shell. There is no argument to this option. You can selectively add back any internal commands by referencing them in your shell plugin file. Look at the Spring Shell javadocs for specific commands located in the org.springframework.shell.commands package as well as the section in this documentation of Built in commands.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/test/java/org/apache/rya/shell/RyaAdminCommandsTest.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/test/java/org/apache/rya/shell/RyaAdminCommandsTest.java b/extras/rya.console/src/test/java/org/apache/rya/shell/RyaAdminCommandsTest.java
index a5b73f2..e3e8d98 100644
--- a/extras/rya.console/src/test/java/org/apache/rya/shell/RyaAdminCommandsTest.java
+++ b/extras/rya.console/src/test/java/org/apache/rya/shell/RyaAdminCommandsTest.java
@@ -84,7 +84,7 @@ public class RyaAdminCommandsTest {
         state.connectedToInstance(instanceName);
 
         final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
-        when(mockSparqlPrompt.getSparql()).thenReturn(sparql);
+        when(mockSparqlPrompt.getSparql()).thenReturn(Optional.of(sparql));
 
         // Execute the command.
         final RyaAdminCommands commands = new RyaAdminCommands(state, mock(InstallPrompt.class), mockSparqlPrompt, mock(UninstallPrompt.class));
@@ -99,6 +99,29 @@ public class RyaAdminCommandsTest {
     }
 
     @Test
+    public void createPCJ_cancelledPrompt() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+
+        final RyaClient mockCommands = mock(RyaClient.class);
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+        when(mockSparqlPrompt.getSparql()).thenReturn(Optional.absent());
+
+        // Execute the command.
+        final RyaAdminCommands commands = new RyaAdminCommands(state, mock(InstallPrompt.class), mockSparqlPrompt, mock(UninstallPrompt.class));
+        final String message = commands.createPcj();
+
+        // Verify a message is returned that explains what was created.
+        final String expected = "";
+        assertEquals(expected, message);
+    }
+
+    @Test
     public void deletePCJ() throws InstanceDoesNotExistException, RyaClientException {
         // Mock the object that performs the delete operation.
         final DeletePCJ mockDeletePCJ = mock(DeletePCJ.class);
@@ -170,7 +193,7 @@ public class RyaAdminCommandsTest {
 
         // Execute the command.
         final RyaAdminCommands commands = new RyaAdminCommands(state, mock(InstallPrompt.class), mock(SparqlPrompt.class), mock(UninstallPrompt.class));
-        final String message = commands.getInstanceDetails();
+        final String message = commands.printInstanceDetails();
 
         // Verify the values that were provided to the command were passed through to the GetInstanceDetails.
         verify(mockGetInstanceDetails).getDetails(eq(instanceName));
@@ -228,7 +251,7 @@ public class RyaAdminCommandsTest {
 
         final InstallPrompt mockInstallPrompt = mock(InstallPrompt.class);
         when(mockInstallPrompt.promptInstanceName()).thenReturn( instanceName );
-        when(mockInstallPrompt.promptInstallConfiguration()).thenReturn( installConfig );
+        when(mockInstallPrompt.promptInstallConfiguration(instanceName)).thenReturn( installConfig );
         when(mockInstallPrompt.promptVerified(eq(instanceName), eq(installConfig))).thenReturn(true);
 
         final RyaAdminCommands commands = new RyaAdminCommands(state, mockInstallPrompt, mock(SparqlPrompt.class), mock(UninstallPrompt.class));
@@ -243,6 +266,97 @@ public class RyaAdminCommandsTest {
     }
 
     @Test
+    public void installWithParameters() throws DuplicateInstanceNameException, RyaClientException, IOException {
+        // Mock the object that performs the install operation.
+        final Install mockInstall = mock(Install.class);
+
+        final RyaClient mockCommands = mock(RyaClient.class);
+        when(mockCommands.getInstall()).thenReturn( mockInstall );
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+
+        final String instanceName = "unitTests";
+        final boolean enableTableHashPrefix = false;
+        final boolean enableEntityCentricIndex = true;
+        final boolean enableFreeTextIndex = false;
+        final boolean enableGeospatialIndex = true;
+        final boolean enableTemporalIndex = false;
+        final boolean enablePcjIndex = true;
+        final String fluoPcjAppName = instanceName + "pcj_updater";
+
+        // Execute the command.
+        final InstallConfiguration installConfig = InstallConfiguration.builder()
+                .setEnableTableHashPrefix(enableTableHashPrefix)
+                .setEnableEntityCentricIndex(enableEntityCentricIndex)
+                .setEnableFreeTextIndex(enableFreeTextIndex)
+                .setEnableGeoIndex(enableGeospatialIndex)
+                .setEnableTemporalIndex(enableTemporalIndex)
+                .setEnablePcjIndex(enablePcjIndex)
+                .setFluoPcjAppName(fluoPcjAppName)
+                .build();
+
+        final InstallPrompt mockInstallPrompt = mock(InstallPrompt.class);
+        when(mockInstallPrompt.promptInstanceName()).thenReturn( instanceName );
+        when(mockInstallPrompt.promptInstallConfiguration(instanceName)).thenReturn( installConfig );
+        when(mockInstallPrompt.promptVerified(eq(instanceName), eq(installConfig))).thenReturn(true);
+
+        final RyaAdminCommands commands = new RyaAdminCommands(state, mockInstallPrompt, mock(SparqlPrompt.class), mock(UninstallPrompt.class));
+        final String message = commands.installWithParameters(instanceName, enableTableHashPrefix, enableEntityCentricIndex, enableFreeTextIndex, enableGeospatialIndex, enableTemporalIndex, enablePcjIndex, fluoPcjAppName);
+
+        // Verify the values that were provided to the command were passed through to the Install.
+        verify(mockInstall).install(eq(instanceName), eq(installConfig));
+
+        // Verify a message is returned that indicates the success of the operation.
+        final String expected = "The Rya instance named 'unitTests' has been installed.";
+        assertEquals(expected, message);
+    }
+
+    @Test
+    public void installWithParameters_userAbort() throws DuplicateInstanceNameException, RyaClientException, IOException {
+        // Mock the object that performs the install operation.
+        final Install mockInstall = mock(Install.class);
+
+        final RyaClient mockCommands = mock(RyaClient.class);
+        when(mockCommands.getInstall()).thenReturn( mockInstall );
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+
+        final String instanceName = "unitTests";
+        final boolean enableTableHashPrefix = false;
+        final boolean enableEntityCentricIndex = true;
+        final boolean enableFreeTextIndex = false;
+        final boolean enableGeospatialIndex = true;
+        final boolean enableTemporalIndex = false;
+        final boolean enablePcjIndex = true;
+        final String fluoPcjAppName = instanceName + "pcj_updater";
+
+        // Execute the command.
+        final InstallConfiguration installConfig = InstallConfiguration.builder()
+                .setEnableTableHashPrefix(enableTableHashPrefix)
+                .setEnableEntityCentricIndex(enableEntityCentricIndex)
+                .setEnableFreeTextIndex(enableFreeTextIndex)
+                .setEnableGeoIndex(enableGeospatialIndex)
+                .setEnableTemporalIndex(enableTemporalIndex)
+                .setEnablePcjIndex(enablePcjIndex)
+                .setFluoPcjAppName(fluoPcjAppName)
+                .build();
+
+        final InstallPrompt mockInstallPrompt = mock(InstallPrompt.class);
+        when(mockInstallPrompt.promptInstanceName()).thenReturn( instanceName );
+        when(mockInstallPrompt.promptInstallConfiguration(instanceName)).thenReturn( installConfig );
+        when(mockInstallPrompt.promptVerified(eq(instanceName), eq(installConfig))).thenReturn(false);
+
+        final RyaAdminCommands commands = new RyaAdminCommands(state, mockInstallPrompt, mock(SparqlPrompt.class), mock(UninstallPrompt.class));
+        final String message = commands.installWithParameters(instanceName, enableTableHashPrefix, enableEntityCentricIndex, enableFreeTextIndex, enableGeospatialIndex, enableTemporalIndex, enablePcjIndex, fluoPcjAppName);
+
+        // Verify a message is returned that indicates the success of the operation.
+        final String expected = "Skipping Installation.";
+        assertEquals(expected, message);
+    }
+
+    @Test
     public void listInstances() throws RyaClientException, IOException {
         // Mock the object that performs the list operation.
         final ListInstances mockListInstances = mock(ListInstances.class);

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/test/java/org/apache/rya/shell/RyaCommandsTest.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/test/java/org/apache/rya/shell/RyaCommandsTest.java b/extras/rya.console/src/test/java/org/apache/rya/shell/RyaCommandsTest.java
new file mode 100644
index 0000000..a0a3979
--- /dev/null
+++ b/extras/rya.console/src/test/java/org/apache/rya/shell/RyaCommandsTest.java
@@ -0,0 +1,278 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.rya.shell;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.rya.api.client.ExecuteSparqlQuery;
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+import org.apache.rya.api.client.LoadStatementsFile;
+import org.apache.rya.api.client.RyaClient;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.api.client.accumulo.AccumuloConnectionDetails;
+import org.apache.rya.shell.util.ConsolePrinter;
+import org.apache.rya.shell.util.SparqlPrompt;
+import org.junit.Test;
+import org.openrdf.rio.RDFFormat;
+
+import com.google.common.base.Optional;
+
+/**
+ * Unit tests the methods of {@link RyaAdminCommands}.
+ */
+public class RyaCommandsTest {
+
+    @Test
+    public void testLoadData() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+        final String statementsFile = "/path/to/statements.nt";
+        final String format = null;
+
+        final LoadStatementsFile mockLoadStatementsFile = mock(LoadStatementsFile.class);
+        final RyaClient mockCommands = mock(RyaClient.class);
+        when(mockCommands.getLoadStatementsFile()).thenReturn(mockLoadStatementsFile);
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+
+        final ConsolePrinter mockConsolePrinter = mock(ConsolePrinter.class);
+
+        // Execute the command.
+        final RyaCommands commands = new RyaCommands(state, mockSparqlPrompt, mockConsolePrinter);
+        final String message = commands.loadData(statementsFile, format);
+
+        // Verify the values that were provided to the command were passed through to LoadStatementsFile.
+        verify(mockLoadStatementsFile).loadStatements(instanceName, Paths.get(statementsFile), RDFFormat.NTRIPLES);
+
+        // Verify a message is returned that explains what was created.
+        assertTrue(message.startsWith("Loaded the file: '" + statementsFile +"' successfully in "));
+        assertTrue(message.endsWith(" seconds."));
+    }
+
+    @Test
+    public void testLoadData_specifyFormat() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+        final String statementsFile = "/path/to/statements.nt";
+        final String format = "N-TRIPLES";
+
+        final LoadStatementsFile mockLoadStatementsFile = mock(LoadStatementsFile.class);
+        final RyaClient mockCommands = mock(RyaClient.class);
+        when(mockCommands.getLoadStatementsFile()).thenReturn(mockLoadStatementsFile);
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+
+        final ConsolePrinter mockConsolePrinter = mock(ConsolePrinter.class);
+
+        // Execute the command.
+        final RyaCommands commands = new RyaCommands(state, mockSparqlPrompt, mockConsolePrinter);
+        final String message = commands.loadData(statementsFile, format);
+
+        // Verify the values that were provided to the command were passed through to LoadStatementsFile.
+        verify(mockLoadStatementsFile).loadStatements(instanceName, Paths.get(statementsFile), RDFFormat.NTRIPLES);
+
+        // Verify a message is returned that explains what was created.
+        assertTrue(message.startsWith("Loaded the file: '" + statementsFile +"' successfully in "));
+        assertTrue(message.endsWith(" seconds."));
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void testLoadData_specifyInvalidFormat() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+        final String statementsFile = "/path/to/statements.nt";
+        final String format = "INVALID_FORMAT_NAME";
+
+        final LoadStatementsFile mockLoadStatementsFile = mock(LoadStatementsFile.class);
+        final RyaClient mockCommands = mock(RyaClient.class);
+        when(mockCommands.getLoadStatementsFile()).thenReturn(mockLoadStatementsFile);
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+
+        final ConsolePrinter mockConsolePrinter = mock(ConsolePrinter.class);
+
+        // Execute the command.
+        final RyaCommands commands = new RyaCommands(state, mockSparqlPrompt, mockConsolePrinter);
+
+        commands.loadData(statementsFile, format);
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void testLoadData_specifyInvalidFilenameFormat() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+        final String statementsFile = "/path/to/statements.invalidFormat";
+        final String format = null;
+
+        final LoadStatementsFile mockLoadStatementsFile = mock(LoadStatementsFile.class);
+        final RyaClient mockCommands = mock(RyaClient.class);
+        when(mockCommands.getLoadStatementsFile()).thenReturn(mockLoadStatementsFile);
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+
+        final ConsolePrinter mockConsolePrinter = mock(ConsolePrinter.class);
+
+        // Execute the command.
+        final RyaCommands commands = new RyaCommands(state, mockSparqlPrompt, mockConsolePrinter);
+
+        commands.loadData(statementsFile, format);
+    }
+
+    @Test
+    public void testSparqlQuery() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+        final String queryFile = "src/test/resources/Query1.sparql";
+        final String queryContent = FileUtils.readFileToString(new File(queryFile), StandardCharsets.UTF_8);
+        final String expectedMessage = "MockAnswer";
+
+        final ExecuteSparqlQuery mockExecuteSparqlQuery = mock(ExecuteSparqlQuery.class);
+        when(mockExecuteSparqlQuery.executeSparqlQuery(instanceName, queryContent)).thenReturn(expectedMessage);
+
+        final RyaClient mockCommands = mock(RyaClient.class);
+        when(mockCommands.getExecuteSparqlQuery()).thenReturn(mockExecuteSparqlQuery);
+
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+
+        final ConsolePrinter mockConsolePrinter = mock(ConsolePrinter.class);
+
+        // Execute the command.
+        final RyaCommands commands = new RyaCommands(state, mockSparqlPrompt, mockConsolePrinter);
+        final String message = commands.sparqlQuery(queryFile);
+
+        // Verify the values that were provided to the command were passed through to LoadStatementsFile.
+        verify(mockExecuteSparqlQuery).executeSparqlQuery(instanceName, queryContent);
+
+        assertEquals(expectedMessage, message);
+        // Verify a message is returned that explains what was created.
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void testSparqlQuery_nonexistentFile() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+        final String queryFile = "src/test/resources/Nonexistent.sparql";
+
+        final RyaClient mockCommands = mock(RyaClient.class);
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+
+        final ConsolePrinter mockConsolePrinter = mock(ConsolePrinter.class);
+
+        // Execute the command.
+        final RyaCommands commands = new RyaCommands(state, mockSparqlPrompt, mockConsolePrinter);
+        commands.sparqlQuery(queryFile);
+    }
+
+    @Test
+    public void testSparqlQuery_fromPrompt() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+        final String queryContent = "SELECT * WHERE { ?person <http://isA> ?noun }";
+        final String queryFile = null;
+        final String expectedMessage = "MockAnswer";
+
+        final ExecuteSparqlQuery mockExecuteSparqlQuery = mock(ExecuteSparqlQuery.class);
+        when(mockExecuteSparqlQuery.executeSparqlQuery(instanceName, queryContent)).thenReturn(expectedMessage);
+
+        final RyaClient mockCommands = mock(RyaClient.class);
+        when(mockCommands.getExecuteSparqlQuery()).thenReturn(mockExecuteSparqlQuery);
+
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+        when(mockSparqlPrompt.getSparql()).thenReturn(Optional.of(queryContent));
+
+        final ConsolePrinter mockConsolePrinter = mock(ConsolePrinter.class);
+
+        // Execute the command.
+        final RyaCommands commands = new RyaCommands(state, mockSparqlPrompt, mockConsolePrinter);
+        final String message = commands.sparqlQuery(queryFile);
+
+        // Verify the values that were provided to the command were passed through to LoadStatementsFile.
+        verify(mockExecuteSparqlQuery).executeSparqlQuery(instanceName, queryContent);
+
+        assertEquals(expectedMessage, message);
+        // Verify a message is returned that explains what was created.
+    }
+
+    @Test
+    public void testSparqlQuery_fromPrompt_cancelled() throws InstanceDoesNotExistException, RyaClientException, IOException {
+        // Mock the object that performs the create operation.
+        final String instanceName = "unitTest";
+        final String queryFile = null;
+        final String expectedMessage = "";
+
+        final RyaClient mockCommands = mock(RyaClient.class);
+
+        final SharedShellState state = new SharedShellState();
+        state.connectedToAccumulo(mock(AccumuloConnectionDetails.class), mockCommands);
+        state.connectedToInstance(instanceName);
+
+        final SparqlPrompt mockSparqlPrompt = mock(SparqlPrompt.class);
+        when(mockSparqlPrompt.getSparql()).thenReturn(Optional.absent());
+
+        final ConsolePrinter mockConsolePrinter = mock(ConsolePrinter.class);
+
+        // Execute the command.
+        final RyaCommands commands = new RyaCommands(state, mockSparqlPrompt, mockConsolePrinter);
+        final String message = commands.sparqlQuery(queryFile);
+
+        assertEquals(expectedMessage, message);
+        // Verify a message is returned that explains what was created.
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/test/java/org/apache/rya/shell/RyaConnectionCommandsIT.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/test/java/org/apache/rya/shell/RyaConnectionCommandsIT.java b/extras/rya.console/src/test/java/org/apache/rya/shell/RyaConnectionCommandsIT.java
index 6d2644b..f424c49 100644
--- a/extras/rya.console/src/test/java/org/apache/rya/shell/RyaConnectionCommandsIT.java
+++ b/extras/rya.console/src/test/java/org/apache/rya/shell/RyaConnectionCommandsIT.java
@@ -16,24 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-///**
-// * Licensed to the Apache Software Foundation (ASF) under one
-// * or more contributor license agreements.  See the NOTICE file
-// * distributed with this work for additional information
-// * regarding copyright ownership.  The ASF licenses this file
-// * to you under the Apache License, Version 2.0 (the
-// * "License"); you may not use this file except in compliance
-// * with the License.  You may obtain a copy of the License at
-// *
-// *     http://www.apache.org/licenses/LICENSE-2.0
-// *
-// * Unless required by applicable law or agreed to in writing,
-// * software distributed under the License is distributed on an
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// * KIND, either express or implied.  See the License for the
-// * specific language governing permissions and limitations
-// * under the License.
-// */
 package org.apache.rya.shell;
 
 import static org.junit.Assert.assertEquals;
@@ -44,17 +26,16 @@ import static org.mockito.Mockito.when;
 import java.io.IOException;
 
 import org.apache.accumulo.minicluster.MiniAccumuloCluster;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.shell.Bootstrap;
-import org.springframework.shell.core.CommandResult;
-import org.springframework.shell.core.JLineShellComponent;
-
 import org.apache.rya.api.client.Install.InstallConfiguration;
 import org.apache.rya.shell.SharedShellState.ConnectionState;
 import org.apache.rya.shell.SharedShellState.ShellState;
 import org.apache.rya.shell.util.InstallPrompt;
 import org.apache.rya.shell.util.PasswordPrompt;
+import org.junit.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.shell.Bootstrap;
+import org.springframework.shell.core.CommandResult;
+import org.springframework.shell.core.JLineShellComponent;
 
 /**
  * Integration tests the methods of {@link RyaConnectionCommands}.
@@ -201,7 +182,7 @@ public class RyaConnectionCommandsIT extends RyaShellITBase {
 
         final InstallPrompt installPrompt = context.getBean( InstallPrompt.class );
         when(installPrompt.promptInstanceName()).thenReturn("testInstance");
-        when(installPrompt.promptInstallConfiguration()).thenReturn( installConf );
+        when(installPrompt.promptInstallConfiguration("testInstance")).thenReturn( installConf );
         when(installPrompt.promptVerified(instanceName, installConf)).thenReturn(true);
 
         result = shell.executeCommand( RyaAdminCommands.INSTALL_CMD );

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/test/resources/Query1.sparql
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/test/resources/Query1.sparql b/extras/rya.console/src/test/resources/Query1.sparql
new file mode 100644
index 0000000..555607e
--- /dev/null
+++ b/extras/rya.console/src/test/resources/Query1.sparql
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+SELECT * WHERE { ?person <http://isA> ?noun }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/test/resources/RyaShellTest-context.xml
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/test/resources/RyaShellTest-context.xml b/extras/rya.console/src/test/resources/RyaShellTest-context.xml
index f841129..f7ffe0f 100644
--- a/extras/rya.console/src/test/resources/RyaShellTest-context.xml
+++ b/extras/rya.console/src/test/resources/RyaShellTest-context.xml
@@ -46,6 +46,11 @@
         <constructor-arg value="org.apache.rya.shell.util.SparqlPrompt"/>
     </bean>
     
+    <!-- We use a mock ConsolePrintert here to simulate console output to the user. -->
+    <bean id="consolePrinter" class="org.mockito.Mockito" factory-method="mock">
+        <constructor-arg value="org.apache.rya.shell.util.ConsolePrinter"/>
+    </bean>
+    
     <!-- We use a mock Uninstall Prompt here to simulate a user entering the installation configuration. -->
     <bean id="uninstallPrompt" class="org.mockito.Mockito" factory-method="mock">
         <constructor-arg value="org.apache.rya.shell.util.UninstallPrompt"/>
@@ -53,5 +58,6 @@
 
     <!-- Define each of the beans that hold onto commands used by the shell. -->
     <bean id="ryaConnectionCommands" class="org.apache.rya.shell.RyaConnectionCommands" />
+    <bean id="ryaCommands" class="org.apache.rya.shell.RyaCommands" />
     <bean id="ryaAdminCommands" class="org.apache.rya.shell.RyaAdminCommands" />
 </beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 52c5bd6..93c6ed8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -293,6 +293,11 @@ under the License.
             </dependency>
             <dependency>
                 <groupId>org.openrdf.sesame</groupId>
+                <artifactId>sesame-queryresultio-text</artifactId>
+                <version>${openrdf.sesame.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.openrdf.sesame</groupId>
                 <artifactId>sesame-rio-rdfxml</artifactId>
                 <version>${openrdf.sesame.version}</version>
             </dependency>
@@ -780,6 +785,11 @@ under the License.
                     </configuration>
                 </plugin>
                 <plugin>
+                    <groupId>org.jacoco</groupId>
+                    <artifactId>jacoco-maven-plugin</artifactId>
+                    <version>0.7.9</version>
+                </plugin>
+                <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-checkstyle-plugin</artifactId>
                 </plugin>



[2/2] incubator-rya git commit: RYA-318 Rya Shell improvements for packaging, loading and querying.

Posted by ca...@apache.org.
RYA-318 Rya Shell improvements for packaging, loading and querying.

Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/fa2aad55
Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/fa2aad55
Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/fa2aad55

Branch: refs/heads/master
Commit: fa2aad55f4dfd4f78cc1b6b2da39b511ce206a8d
Parents: 65f6d47
Author: jdasch <jd...@localhost.localdomain>
Authored: Thu Jul 27 11:00:52 2017 -0400
Committer: Caleb Meier <ca...@parsons.com>
Committed: Thu Aug 3 10:23:56 2017 -0700

----------------------------------------------------------------------
 .../rya/api/client/ExecuteSparqlQuery.java      |  39 +++
 .../org/apache/rya/api/client/RyaClient.java    |  14 +-
 extras/indexing/pom.xml                         | 341 ++++++++++---------
 .../accumulo/AccumuloConnectionDetails.java     |  23 +-
 .../accumulo/AccumuloExecuteSparqlQuery.java    | 181 ++++++++++
 .../api/client/accumulo/AccumuloInstall.java    |  11 +-
 .../accumulo/AccumuloLoadStatementsFile.java    |  19 +-
 .../accumulo/AccumuloRyaClientFactory.java      |   3 +-
 .../accumulo/AccumuloLoadStatementsFileIT.java  |   2 +-
 extras/rya.console/pom.xml                      |  33 +-
 .../src/main/assembly/binary-release.xml        |  33 ++
 .../src/main/assembly/component-release.xml     |  90 +++++
 .../src/main/config/log4j.properties            |  35 ++
 .../rya.console/src/main/examples/Query1.sparql |  24 ++
 .../src/main/examples/example.script            |  26 ++
 extras/rya.console/src/main/examples/triples.nt |  25 ++
 .../org/apache/rya/shell/RyaAdminCommands.java  |  84 ++++-
 .../java/org/apache/rya/shell/RyaCommands.java  | 166 +++++++++
 .../apache/rya/shell/RyaConnectionCommands.java |  25 +-
 .../rya/shell/RyaShellHistoryProvider.java      |  51 +++
 .../apache/rya/shell/util/ConsolePrinter.java   |  85 +++++
 .../apache/rya/shell/util/InstallPrompt.java    |  32 +-
 .../org/apache/rya/shell/util/JLinePrompt.java  |  16 +-
 .../org/apache/rya/shell/util/SparqlPrompt.java |  44 ++-
 .../META-INF/spring/spring-shell-plugin.xml     |  10 +
 extras/rya.console/src/main/scripts/rya         |  33 ++
 .../apache/rya/shell/RyaAdminCommandsTest.java  | 120 ++++++-
 .../org/apache/rya/shell/RyaCommandsTest.java   | 278 +++++++++++++++
 .../rya/shell/RyaConnectionCommandsIT.java      |  31 +-
 .../src/test/resources/Query1.sparql            |  20 ++
 .../src/test/resources/RyaShellTest-context.xml |   6 +
 pom.xml                                         |  10 +
 32 files changed, 1638 insertions(+), 272 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/common/rya.api/src/main/java/org/apache/rya/api/client/ExecuteSparqlQuery.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/client/ExecuteSparqlQuery.java b/common/rya.api/src/main/java/org/apache/rya/api/client/ExecuteSparqlQuery.java
new file mode 100644
index 0000000..817b752
--- /dev/null
+++ b/common/rya.api/src/main/java/org/apache/rya/api/client/ExecuteSparqlQuery.java
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.rya.api.client;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * Loads a SPARQL Query and executes the query against an instance of Rya.
+ */
+@DefaultAnnotation(NonNull.class)
+public interface ExecuteSparqlQuery {
+    /**
+     * Loads a SPARQL Query and executes the query against an instance of Rya.
+     *
+     * @param ryaInstanceName - The name of the Rya instance the query will be executed against. (not null)
+     * @param sparqlQuery - A single SPARQL Query. (not null)
+     * @return A user-friendly String representation of the query results.
+     * @throws InstanceDoesNotExistException No instance of Rya exists for the provided name.
+     * @throws RyaClientException Something caused the command to fail.
+     */
+    public String executeSparqlQuery(String ryaInstanceName, String sparqlQuery) throws InstanceDoesNotExistException, RyaClientException;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/common/rya.api/src/main/java/org/apache/rya/api/client/RyaClient.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/client/RyaClient.java b/common/rya.api/src/main/java/org/apache/rya/api/client/RyaClient.java
index 9e0ef4f..d1481dc 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/client/RyaClient.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/client/RyaClient.java
@@ -42,6 +42,7 @@ public class RyaClient {
     private final RemoveUser removeUser;
     private final Uninstall uninstall;
     private final LoadStatementsFile loadStatementsFile;
+    private final ExecuteSparqlQuery executeSparqlQuery;
 
     /**
      * Constructs an instance of {@link RyaClient}.
@@ -57,7 +58,8 @@ public class RyaClient {
             final AddUser addUser,
             final RemoveUser removeUser,
             final Uninstall uninstall,
-            final LoadStatementsFile loadStatementsFile) {
+            final LoadStatementsFile loadStatementsFile,
+            final ExecuteSparqlQuery executeSparqlQuery) {
         this.install = requireNonNull(install);
         this.createPcj = requireNonNull(createPcj);
         this.deletePcj = requireNonNull(deletePcj);
@@ -68,7 +70,8 @@ public class RyaClient {
         this.addUser = requireNonNull(addUser);
         this.removeUser = requireNonNull(removeUser);
         this.uninstall = requireNonNull(uninstall);
-        this.loadStatementsFile = requireNonNull( loadStatementsFile );
+        this.loadStatementsFile = requireNonNull(loadStatementsFile);
+        this.executeSparqlQuery = requireNonNull(executeSparqlQuery);
     }
 
     /**
@@ -150,4 +153,11 @@ public class RyaClient {
     public LoadStatementsFile getLoadStatementsFile() {
         return loadStatementsFile;
     }
+
+    /**
+     * @return An instance of {@link ExecuteSparqlQuery} that is connected to a Rya storage.
+     */
+    public ExecuteSparqlQuery getExecuteSparqlQuery() {
+        return executeSparqlQuery;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/indexing/pom.xml
----------------------------------------------------------------------
diff --git a/extras/indexing/pom.xml b/extras/indexing/pom.xml
index 755646c..44e3e41 100644
--- a/extras/indexing/pom.xml
+++ b/extras/indexing/pom.xml
@@ -1,103 +1,109 @@
 <?xml version='1.0'?>
 
 <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	you under the Apache License, Version 2.0 (the "License"); you may not use 
-	this file except in compliance with the License. You may obtain a copy of 
-	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
-	by applicable law or agreed to in writing, software distributed under the 
-	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
-	OF ANY KIND, either express or implied. See the License for the specific 
-	language governing permissions and limitations under the License. -->
+    license agreements. See the NOTICE file distributed with this work for additional 
+    information regarding copyright ownership. The ASF licenses this file to 
+    you under the Apache License, Version 2.0 (the "License"); you may not use 
+    this file except in compliance with the License. You may obtain a copy of 
+    the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
+    by applicable law or agreed to in writing, software distributed under the 
+    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
+    OF ANY KIND, either express or implied. See the License for the specific 
+    language governing permissions and limitations under the License. -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.rya</groupId>
-		<artifactId>rya.extras</artifactId>
-		<version>3.2.11-incubating-SNAPSHOT</version>
-	</parent>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.rya</groupId>
+        <artifactId>rya.extras</artifactId>
+        <version>3.2.11-incubating-SNAPSHOT</version>
+    </parent>
 
-	<artifactId>rya.indexing</artifactId>
-	<name>Apache Rya Secondary Indexing</name>
+    <artifactId>rya.indexing</artifactId>
+    <name>Apache Rya Secondary Indexing</name>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-     </properties>
+    </properties>
 
-	<dependencies>
-
-		<dependency>
-		   <groupId>org.apache.accumulo</groupId>
-            <artifactId>accumulo-minicluster</artifactId>
-            <scope>test</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>org.apache.rya</groupId>
-			<artifactId>rya.sail</artifactId>
-			<exclusions>
-				<exclusion>
-					<artifactId>hsqldb</artifactId>
-					<groupId>hsqldb</groupId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.rya</groupId>
-			<artifactId>accumulo.rya</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.rya</groupId>
-			<artifactId>mongodb.rya</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.rya</groupId>
-			<artifactId>rya.prospector</artifactId>
-		</dependency>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.sail</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>hsqldb</artifactId>
+                    <groupId>hsqldb</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>accumulo.rya</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>mongodb.rya</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.prospector</artifactId>
+        </dependency>
 
-		<!-- Free Text Indexing -->
-		<dependency>
-			<groupId>org.apache.lucene</groupId>
-			<artifactId>lucene-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.lucene</groupId>
-			<artifactId>lucene-analyzers</artifactId>
-		</dependency>
+        <!-- Free Text Indexing -->
+        <dependency>
+            <groupId>org.apache.lucene</groupId>
+            <artifactId>lucene-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.lucene</groupId>
+            <artifactId>lucene-analyzers</artifactId>
+        </dependency>
 
-		<dependency>
-			<groupId>commons-codec</groupId>
-			<artifactId>commons-codec</artifactId>
-		</dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
 
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpclient</artifactId>
-		</dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
 
 
-		<!-- PCJ Indexing -->
-		<dependency>
-			<groupId>org.apache.rya</groupId>
-			<artifactId>rya.indexing.pcj</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.rya</groupId>
-			<artifactId>rya.pcj.fluo.api</artifactId>
-		</dependency>
+        <!-- PCJ Indexing -->
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.indexing.pcj</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.pcj.fluo.api</artifactId>
+        </dependency>
+        
+        <!-- OpenRDF -->
+        <dependency>
+            <groupId>org.openrdf.sesame</groupId>
+            <artifactId>sesame-queryresultio-text</artifactId>
+        </dependency>
 
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-			<scope>test</scope>
-		</dependency>
+        <!--  testing dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.accumulo</groupId>
+            <artifactId>accumulo-minicluster</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.apache.fluo</groupId>
             <artifactId>fluo-mini</artifactId>
@@ -117,86 +123,89 @@
             <scope>test</scope>
             <type>test-jar</type>
         </dependency>
-	</dependencies>
-	<build>
-		<pluginManagement>
-			<plugins>
-				<plugin>
-					<groupId>org.apache.rat</groupId>
-					<artifactId>apache-rat-plugin</artifactId>
-					<configuration>
-						<excludes>
-							<!-- RDF data Files -->
-							<exclude>**/*.ttl</exclude>
+        
+    </dependencies>
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.rat</groupId>
+                    <artifactId>apache-rat-plugin</artifactId>
+                    <configuration>
+                        <excludes>
+                            <!-- RDF data Files -->
+                            <exclude>**/*.ttl</exclude>
 
-							<!-- Services Files -->
-							<exclude>**/resources/META-INF/services/**</exclude>
-						</excludes>
-					</configuration>
-				</plugin>
-			</plugins>
-		</pluginManagement>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-shade-plugin</artifactId>
-				<executions>
-					<execution>
-						<configuration>
-							<shadedArtifactAttached>true</shadedArtifactAttached>
-							<shadedClassifierName>map-reduce</shadedClassifierName>
-							<transformers>
-								<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
-							</transformers>
-							<filters>
-								<filter>
-									<artifact>*:*</artifact>
-									<excludes>
-										<exclude>META-INF/*.SF</exclude>
-										<exclude>META-INF/*.DSA</exclude>
-										<exclude>META-INF/*.RSA</exclude>
-									</excludes>
-								</filter>
-							</filters>
-						</configuration>
-					</execution>
-					<execution>
-						<id>accumulo-server</id>
-						<phase>package</phase>
-						<goals>
-							<goal>shade</goal>
-						</goals>
-						<configuration>
-							<shadedArtifactAttached>true</shadedArtifactAttached>
-							<shadedClassifierName>accumulo-server</shadedClassifierName>
-							<artifactSet>
-								<excludes>
-									<exclude>org.locationtech.geomesa:*</exclude>
-									<exclude>mil.nga.giat:*</exclude>
-									<exclude>scala:*</exclude>
-									<exclude>org.apache.accumulo:*</exclude>
-									<exclude>org.apache.thrift:*</exclude>
-									<exclude>org.apache.hadoop:*</exclude>
-									<exclude>org.apache.zookeeper:*</exclude>
-								</excludes>
-							</artifactSet>
-							<transformers>
-								<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
-							</transformers>
-							<filters>
-								<filter>
-									<artifact>*:*</artifact>
-									<excludes>
-										<exclude>META-INF/*.SF</exclude>
-										<exclude>META-INF/*.DSA</exclude>
-										<exclude>META-INF/*.RSA</exclude>
-									</excludes>
-								</filter>
-							</filters>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
+                            <!-- Services Files -->
+                            <exclude>**/resources/META-INF/services/**</exclude>
+                        </excludes>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <configuration>
+                            <shadedArtifactAttached>true</shadedArtifactAttached>
+                            <shadedClassifierName>map-reduce</shadedClassifierName>
+                            <transformers>
+                                <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
+                            </transformers>
+                            <filters>
+                                <filter>
+                                    <artifact>*:*</artifact>
+                                    <excludes>
+                                        <exclude>META-INF/*.SF</exclude>
+                                        <exclude>META-INF/*.DSA</exclude>
+                                        <exclude>META-INF/*.RSA</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>accumulo-server</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <shadedArtifactAttached>true</shadedArtifactAttached>
+                            <shadedClassifierName>accumulo-server</shadedClassifierName>
+                            <artifactSet>
+                                <excludes>
+                                    <exclude>org.locationtech.geomesa:*</exclude>
+                                    <exclude>mil.nga.giat:*</exclude>
+                                    <exclude>scala:*</exclude>
+                                    <exclude>org.apache.accumulo:*</exclude>
+                                    <exclude>org.apache.thrift:*</exclude>
+                                    <exclude>org.apache.hadoop:*</exclude>
+                                    <exclude>org.apache.zookeeper:*</exclude>
+                                </excludes>
+                            </artifactSet>
+                            <transformers>
+                                <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
+                            </transformers>
+                            <filters>
+                                <filter>
+                                    <artifact>*:*</artifact>
+                                    <excludes>
+                                        <exclude>META-INF/*.SF</exclude>
+                                        <exclude>META-INF/*.DSA</exclude>
+                                        <exclude>META-INF/*.RSA</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java
index f3753a8..c0759c4 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java
@@ -20,6 +20,8 @@ package org.apache.rya.api.client.accumulo;
 
 import static java.util.Objects.requireNonNull;
 
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
 import net.jcip.annotations.Immutable;
@@ -33,7 +35,7 @@ public class AccumuloConnectionDetails {
     private final String username;
     private final char[] password;
     private final String instanceName;
-    private final String zookeepers; 
+    private final String zookeepers;
 
     /**
      * Constructs an instance of {@link AccumuloConnectionDetails}.
@@ -81,4 +83,23 @@ public class AccumuloConnectionDetails {
     public String getZookeepers() {
         return zookeepers;
     }
+
+    /**
+     *
+     * @param ryaInstanceName - The Rya instance to connect to.
+     * @return Constructs a new {@link AccumuloRdfConfiguration} object with values from this object.
+     */
+    public AccumuloRdfConfiguration buildAccumuloRdfConfiguration(final String ryaInstanceName) {
+        
+        // Note, we don't use the AccumuloRdfConfigurationBuilder here because it explicitly sets 
+        // authorizations and visibilities to an empty string if they are not set on the builder.
+        // If they are null in the AccumuloRdfConfiguration object, then Accumulo uses the values stored in accumulo for the user.
+        final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
+                conf.setTablePrefix(ryaInstanceName);
+                conf.setAccumuloZookeepers(zookeepers);
+                conf.setAccumuloInstance(instanceName);
+                conf.setAccumuloUser(username);
+                conf.setAccumuloPassword(new String(password));
+        return conf;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloExecuteSparqlQuery.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloExecuteSparqlQuery.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloExecuteSparqlQuery.java
new file mode 100644
index 0000000..f3e50d0
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloExecuteSparqlQuery.java
@@ -0,0 +1,181 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.rya.api.client.accumulo;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.text.DecimalFormat;
+
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.log4j.Logger;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.api.client.ExecuteSparqlQuery;
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+import org.apache.rya.api.client.InstanceExists;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.api.persist.RyaDAOException;
+import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
+import org.apache.rya.sail.config.RyaSailFactory;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.MalformedQueryException;
+import org.openrdf.query.QueryEvaluationException;
+import org.openrdf.query.QueryLanguage;
+import org.openrdf.query.TupleQuery;
+import org.openrdf.query.TupleQueryResultHandlerException;
+import org.openrdf.query.resultio.text.csv.SPARQLResultsCSVWriter;
+import org.openrdf.repository.RepositoryException;
+import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.repository.sail.SailRepositoryConnection;
+import org.openrdf.sail.Sail;
+import org.openrdf.sail.SailException;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Accumulo implementation of the {@link ExecuteSparqlQuery} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class AccumuloExecuteSparqlQuery extends AccumuloCommand implements ExecuteSparqlQuery {
+    private static final Logger log = Logger.getLogger(AccumuloExecuteSparqlQuery.class);
+
+    private final InstanceExists instanceExists;
+
+    /**
+     * Constructs an instance of {@link AccumuloExecuteSparqlQuery}.
+     *
+     * @param connectionDetails - Details about the values that were used to create
+     *   the connector to the cluster. (not null)
+     * @param connector - Provides programmatic access to the instance of Accumulo
+     *   that hosts Rya instance. (not null)
+     */
+    public AccumuloExecuteSparqlQuery(final AccumuloConnectionDetails connectionDetails, final Connector connector) {
+        super(connectionDetails, connector);
+        instanceExists = new AccumuloInstanceExists(connectionDetails, connector);
+    }
+
+
+    @Override
+    public String executeSparqlQuery(final String ryaInstanceName, final String sparqlQuery)
+            throws InstanceDoesNotExistException, RyaClientException {
+        requireNonNull(ryaInstanceName);
+        requireNonNull(sparqlQuery);
+
+        // Ensure the Rya Instance exists.
+        if(!instanceExists.exists(ryaInstanceName)) {
+            throw new InstanceDoesNotExistException(String.format("There is no Rya instance named '%s'.", ryaInstanceName));
+        }
+
+
+        Sail sail = null;
+        SailRepository sailRepo = null;
+        SailRepositoryConnection sailRepoConn = null;
+
+        try {
+            // Get a Sail object that is connected to the Rya instance.
+            final AccumuloRdfConfiguration ryaConf = getAccumuloConnectionDetails().buildAccumuloRdfConfiguration(ryaInstanceName);
+            sail = RyaSailFactory.getInstance(ryaConf);
+            sailRepo = new SailRepository(sail);
+            sailRepoConn = sailRepo.getConnection();
+
+            // Execute the query.
+            final long start = System.currentTimeMillis();
+            final TupleQuery tupleQuery = sailRepoConn.prepareTupleQuery(QueryLanguage.SPARQL, sparqlQuery);
+            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            final CountingSPARQLResultsCSVWriter handler = new CountingSPARQLResultsCSVWriter(baos);
+            tupleQuery.evaluate(handler);
+            final StringBuilder sb = new StringBuilder();
+
+            final String newline = "\n";
+            sb.append("Query Result:").append(newline);
+            sb.append(new String(baos.toByteArray(), StandardCharsets.UTF_8));
+
+            final String seconds = new DecimalFormat("0.0##").format((System.currentTimeMillis() - start) / 1000.0);
+            sb.append("Retrieved ").append(handler.getCount()).append(" results in ").append(seconds).append(" seconds.");
+
+            return sb.toString();
+
+        } catch (final SailException | AccumuloException | AccumuloSecurityException | RyaDAOException | InferenceEngineException  e) {
+            throw new RyaClientException("A problem connecting to the Rya instance named '" + ryaInstanceName + "' has caused the query to fail.", e);
+        } catch (final MalformedQueryException e) {
+            throw new RyaClientException("There was a problem parsing the supplied query.", e);
+        } catch (final QueryEvaluationException | TupleQueryResultHandlerException e) {
+            throw new RyaClientException("There was a problem evaluating the supplied query.", e);
+        } catch (final RepositoryException e) {
+            throw new RyaClientException("There was a problem executing the query against the Rya instance named " + ryaInstanceName + ".", e);
+        } finally {
+            // Shut it all down.
+            if(sailRepoConn != null) {
+                try {
+                    sailRepoConn.close();
+                } catch (final RepositoryException e) {
+                    log.warn("Couldn't close the SailRepoConnection that is attached to the Rya instance.", e);
+                }
+            }
+            if(sailRepo != null) {
+                try {
+                    sailRepo.shutDown();
+                } catch (final RepositoryException e) {
+                    log.warn("Couldn't shut down the SailRepository that is attached to the Rya instance.", e);
+                }
+            }
+            if(sail != null) {
+                try {
+                    sail.shutDown();
+                } catch (final SailException e) {
+                    log.warn("Couldn't shut down the Sail that is attached to the Rya instance.", e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Subclasses {@link SPARQLResultsCSVWriter} to keep track of the total count of handled {@link BindingSet} objects.
+     */
+    private static class CountingSPARQLResultsCSVWriter extends SPARQLResultsCSVWriter {
+
+        private int count = 0;
+
+        /**
+         * @param out - The OutputStream for results to be written to.
+         */
+        public CountingSPARQLResultsCSVWriter(final OutputStream out) {
+            super(out);
+        }
+        @Override
+        public void handleSolution(final BindingSet bindingSet) throws TupleQueryResultHandlerException {
+            super.handleSolution(bindingSet);
+            count++;
+        }
+
+        /**
+         *
+         * @return The number of BindingSets that were handled by {@link #handleSolution(BindingSet)}.
+         */
+        public int getCount() {
+            return count;
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java
index 6fd0d36..65661d2 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java
@@ -22,9 +22,6 @@ import static java.util.Objects.requireNonNull;
 
 import java.util.Date;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
@@ -55,6 +52,9 @@ import org.openrdf.sail.SailException;
 
 import com.google.common.base.Optional;
 
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
 /**
  * An Accumulo implementation of the {@link Install} command.
  */
@@ -194,6 +194,11 @@ public class AccumuloInstall extends AccumuloCommand implements Install {
          * RYA-215
          * conf.set(ConfigUtils.USE_GEO, "" + details.getGeoIndexDetails().isEnabled() );
          */
+
+        /**
+         * RYA-322
+         * conf.setPrefixRowsWithHash(details.getPrefixRowsWithHashDetails().isEnabled());
+         */
         conf.set(ConfigUtils.USE_FREETEXT, "" + details.getFreeTextIndexDetails().isEnabled() );
         conf.set(ConfigUtils.USE_TEMPORAL, "" + details.getTemporalIndexDetails().isEnabled() );
         conf.set(ConfigUtils.USE_ENTITY, "" + details.getEntityCentricIndexDetails().isEnabled());

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java
index f39951d..182432a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java
@@ -33,7 +33,6 @@ import org.apache.rya.api.client.InstanceExists;
 import org.apache.rya.api.client.LoadStatementsFile;
 import org.apache.rya.api.client.RyaClientException;
 import org.apache.rya.api.persist.RyaDAOException;
-import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.openrdf.repository.RepositoryException;
@@ -41,6 +40,7 @@ import org.openrdf.repository.sail.SailRepository;
 import org.openrdf.repository.sail.SailRepositoryConnection;
 import org.openrdf.rio.RDFFormat;
 import org.openrdf.rio.RDFParseException;
+import org.openrdf.rio.UnsupportedRDFormatException;
 import org.openrdf.sail.Sail;
 import org.openrdf.sail.SailException;
 
@@ -86,25 +86,20 @@ public class AccumuloLoadStatementsFile extends AccumuloCommand implements LoadS
 
         try {
             // Get a Sail object that is connected to the Rya instance.
-            final AccumuloConnectionDetails connDetails = getAccumuloConnectionDetails();
-
-            final AccumuloRdfConfiguration ryaConf = new AccumuloRdfConfiguration();
-            ryaConf.setTablePrefix( ryaInstanceName );
-            ryaConf.set(ConfigUtils.CLOUDBASE_ZOOKEEPERS, connDetails.getZookeepers());
-            ryaConf.set(ConfigUtils.CLOUDBASE_INSTANCE, connDetails.getInstanceName());
-            ryaConf.set(ConfigUtils.CLOUDBASE_USER, connDetails.getUsername());
-            ryaConf.set(ConfigUtils.CLOUDBASE_PASSWORD, new String(connDetails.getPassword()));
-
+            final AccumuloRdfConfiguration ryaConf = getAccumuloConnectionDetails().buildAccumuloRdfConfiguration(ryaInstanceName);
+            ryaConf.setFlush(false); //RYA-327 should address this hardcoded value.
             sail = RyaSailFactory.getInstance(ryaConf);
 
             // Load the file.
-            sailRepo = new SailRepository( sail );
+            sailRepo = new SailRepository(sail);
             sailRepoConn = sailRepo.getConnection();
             sailRepoConn.add(statementsFile.toFile(), null, format);
 
         } catch (final SailException | AccumuloException | AccumuloSecurityException | RyaDAOException | InferenceEngineException  e) {
+            log.warn("Exception while loading:", e);
             throw new RyaClientException("A problem connecting to the Rya instance named '" + ryaInstanceName + "' has caused the load to fail.", e);
-        } catch (final RepositoryException | RDFParseException | IOException e) {
+        } catch (final RepositoryException | RDFParseException | UnsupportedRDFormatException | IOException e) {
+            log.warn("Exception while loading:", e);
             throw new RyaClientException("A problem processing the RDF file has caused the load into Rya instance named " + ryaInstanceName + "to fail.", e);
         } finally {
             // Shut it all down.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java
index b9742b0..5ee02f9 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java
@@ -59,6 +59,7 @@ public class AccumuloRyaClientFactory {
                 new AccumuloAddUser(connectionDetails, connector),
                 new AccumuloRemoveUser(connectionDetails, connector),
                 new AccumuloUninstall(connectionDetails, connector),
-                new AccumuloLoadStatementsFile(connectionDetails, connector));
+                new AccumuloLoadStatementsFile(connectionDetails, connector),
+                new AccumuloExecuteSparqlQuery(connectionDetails, connector));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java
index a4ec09c..f5d1923 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java
@@ -123,7 +123,7 @@ public class AccumuloLoadStatementsFileIT extends AccumuloITBase {
         assertEquals(expected, statements);
     }
 
-    private boolean isRyaMetadataStatement(ValueFactory vf, Statement statement) {
+    private boolean isRyaMetadataStatement(final ValueFactory vf, final Statement statement) {
         return statement.getPredicate().equals( vf.createURI("urn:org.apache.rya/2012/05#version") ) ||
                 statement.getPredicate().equals( vf.createURI("urn:org.apache.rya/2012/05#rts") );
     }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/pom.xml
----------------------------------------------------------------------
diff --git a/extras/rya.console/pom.xml b/extras/rya.console/pom.xml
index a9b9030..dec339b 100644
--- a/extras/rya.console/pom.xml
+++ b/extras/rya.console/pom.xml
@@ -33,6 +33,10 @@
 
     <dependencies>
         <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.api</artifactId>
         </dependency>
@@ -54,18 +58,19 @@
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.pcj.fluo.api</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.fluo</groupId>
+            <artifactId>fluo-core</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.shell</groupId>
             <artifactId>spring-shell</artifactId>
         </dependency>
-        
         <dependency>
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-web</artifactId>
             <version>4.1.0.RELEASE</version>
         </dependency>
-        
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -79,7 +84,6 @@
         <dependency>
             <groupId>org.apache.accumulo</groupId>
             <artifactId>accumulo-minicluster</artifactId>
-            <version>${accumulo.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -136,7 +140,6 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
-                <version>2.0</version>
                 <executions>
                     <execution>
                         <phase>package</phase>
@@ -151,6 +154,7 @@
                                 <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>META-INF/spring.schemas</resource>
                                 </transformer>
+                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                 <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                     <mainClass>org.springframework.shell.Bootstrap</mainClass>
                                 </transformer>
@@ -174,11 +178,28 @@
                 </executions>
             </plugin>
             
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>create-binary-distribution</id>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <phase>package</phase>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/assembly/binary-release.xml</descriptor>
+                            </descriptors>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            
             <!-- Generate Code Coverage report. -->
             <plugin>
                 <groupId>org.jacoco</groupId>
                 <artifactId>jacoco-maven-plugin</artifactId>
-                <version>0.7.6.201602180812</version>
                 <executions>
                     <execution>
                         <id>default-prepare-agent</id>

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/assembly/binary-release.xml
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/assembly/binary-release.xml b/extras/rya.console/src/main/assembly/binary-release.xml
new file mode 100644
index 0000000..374213f
--- /dev/null
+++ b/extras/rya.console/src/main/assembly/binary-release.xml
@@ -0,0 +1,33 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<assembly
+    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
+    <id>bin</id>
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+    <includeBaseDirectory>true</includeBaseDirectory>
+    <componentDescriptors>
+        <componentDescriptor>src/main/assembly/component-release.xml</componentDescriptor>
+    </componentDescriptors>
+</assembly>

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/assembly/component-release.xml
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/assembly/component-release.xml b/extras/rya.console/src/main/assembly/component-release.xml
new file mode 100644
index 0000000..72c74d1
--- /dev/null
+++ b/extras/rya.console/src/main/assembly/component-release.xml
@@ -0,0 +1,90 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<component
+    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/component/1.1.3"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/component/1.1.3 http://maven.apache.org/xsd/component-1.1.3.xsd">
+    <fileSets>
+        <fileSet>
+            <directory>src/main/config</directory>
+            <outputDirectory>conf</outputDirectory>
+            <directoryMode>0755</directoryMode>
+            <fileMode>0644</fileMode>
+            <lineEnding>unix</lineEnding>
+            <filtered>false</filtered>
+            <includes>
+                <include>*.properties</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/scripts</directory>
+            <outputDirectory>bin</outputDirectory>
+            <directoryMode>0755</directoryMode>
+            <fileMode>0755</fileMode>
+            <includes>
+                <include>rya</include>
+            </includes>
+            <lineEnding>unix</lineEnding>
+            <filtered>true</filtered>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/scripts</directory>
+            <outputDirectory>bin</outputDirectory>
+            <directoryMode>0755</directoryMode>
+            <fileMode>0644</fileMode>
+            <includes>
+                <include>*.bat</include>
+            </includes>
+            <lineEnding>dos</lineEnding>
+            <filtered>true</filtered>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/examples</directory>
+            <outputDirectory>examples</outputDirectory>
+            <directoryMode>0755</directoryMode>
+            <fileMode>0644</fileMode>
+            <!-- <includes> <include>*.script</include> </includes> -->
+            <lineEnding>unix</lineEnding>
+            <filtered>false</filtered>
+        </fileSet>
+
+        <!-- create an empty directory for log files -->
+        <fileSet>
+            <directory>src/main/assembly</directory>
+            <outputDirectory>logs</outputDirectory>
+            <directoryMode>755</directoryMode>
+            <excludes>
+                <exclude>*</exclude>
+            </excludes>
+        </fileSet>
+
+
+        <fileSet>
+            <directory>${project.build.directory}</directory>
+            <outputDirectory>lib</outputDirectory>
+            <directoryMode>755</directoryMode>
+            <fileMode>0644</fileMode>
+            <includes>
+                <include>${project.artifactId}-${project.version}-shaded.jar</include>
+            </includes>
+        </fileSet>
+    </fileSets>
+</component>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/config/log4j.properties
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/config/log4j.properties b/extras/rya.console/src/main/config/log4j.properties
new file mode 100644
index 0000000..49d6822
--- /dev/null
+++ b/extras/rya.console/src/main/config/log4j.properties
@@ -0,0 +1,35 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# Valid levels:
+# TRACE, DEBUG, INFO, WARN, ERROR and FATAL
+log4j.rootCategory=INFO, LOGFILE
+
+# LOGFILE is set to be a File appender using a PatternLayout.
+log4j.appender.LOGFILE=org.apache.log4j.FileAppender
+log4j.appender.LOGFILE.File=${rya.shell.home}logs/rya-shell.log
+#log4j.appender.LOGFILE.Threshold=DEBUG
+log4j.appender.LOGFILE.Append=true
+
+log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
+log4j.appender.LOGFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
+
+#log4j.appender.LOGFILE.layout=org.apache.log4j.EnhancedPatternLayout
+#log4j.appender.LOGFILE.layout.ConversionPattern=%d [%t] %-5p %c{1.} - %m%n
+

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/examples/Query1.sparql
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/examples/Query1.sparql b/extras/rya.console/src/main/examples/Query1.sparql
new file mode 100644
index 0000000..33619fb
--- /dev/null
+++ b/extras/rya.console/src/main/examples/Query1.sparql
@@ -0,0 +1,24 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+SELECT ?thing ?name WHERE {
+  ?thing <http://predicates#name> ?name .
+  ?thing rdf:type <http://types#Monkey> .
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/examples/example.script
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/examples/example.script b/extras/rya.console/src/main/examples/example.script
new file mode 100644
index 0000000..529ea61
--- /dev/null
+++ b/extras/rya.console/src/main/examples/example.script
@@ -0,0 +1,26 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+connect-accumulo --username accumulo_user --instanceName accumulo_instance --zookeepers zoo1,zoo2,zoo3,zoo4,zoo5
+install-with-parameters --instanceName rya_example_
+connect-rya --instance rya_example_
+#load-data --file examples/ontology.owl
+load-data --file examples/triples.nt
+sparql-query --file examples/Query1.sparql
+# uninstall
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/examples/triples.nt
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/examples/triples.nt b/extras/rya.console/src/main/examples/triples.nt
new file mode 100644
index 0000000..38b6c6f
--- /dev/null
+++ b/extras/rya.console/src/main/examples/triples.nt
@@ -0,0 +1,25 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+<http://Thing1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://types#Monkey> .
+<http://Thing1> <http://predicates#name> "Thing 1".
+<http://Thing2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://types#Gorilla> .
+<http://Thing2> <http://predicates#name> "Thing 2".
+<http://Thing3> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://types#Monkey> .
+<http://Thing3> <http://predicates#name> "Thing 3".

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/java/org/apache/rya/shell/RyaAdminCommands.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/org/apache/rya/shell/RyaAdminCommands.java b/extras/rya.console/src/main/java/org/apache/rya/shell/RyaAdminCommands.java
index 5493170..9239dc7 100644
--- a/extras/rya.console/src/main/java/org/apache/rya/shell/RyaAdminCommands.java
+++ b/extras/rya.console/src/main/java/org/apache/rya/shell/RyaAdminCommands.java
@@ -55,8 +55,9 @@ public class RyaAdminCommands implements CommandMarker {
 
     public static final String CREATE_PCJ_CMD = "create-pcj";
     public static final String DELETE_PCJ_CMD = "delete-pcj";
-    public static final String GET_INSTANCE_DETAILS_CMD = "get-instance-details";
+    public static final String PRINT_INSTANCE_DETAILS_CMD = "print-instance-details";
     public static final String INSTALL_CMD = "install";
+    public static final String INSTALL_PARAMETERS_CMD = "install-with-parameters";
     public static final String LIST_INSTANCES_CMD = "list-instances";
     public static final String UNINSTALL_CMD = "uninstall";
     public static final String ADD_USER_CMD = "add-user";
@@ -107,7 +108,7 @@ public class RyaAdminCommands implements CommandMarker {
      * Enables commands that are always available once the Shell is connected to a Rya Instance.
      */
     @CliAvailabilityIndicator({
-        GET_INSTANCE_DETAILS_CMD,
+        PRINT_INSTANCE_DETAILS_CMD,
         UNINSTALL_CMD,
         ADD_USER_CMD,
         REMOVE_USER_CMD})
@@ -171,7 +172,7 @@ public class RyaAdminCommands implements CommandMarker {
         }
     }
 
-    @CliCommand(value = INSTALL_CMD, help = "Create a new instance of Rya.")
+    @CliCommand(value = INSTALL_CMD, help = "Create a new instance of Rya interactively.")
     public String install() {
         // Fetch the commands that are connected to the store.
         final RyaClient commands = state.getShellState().getConnectedCommands().get();
@@ -183,7 +184,7 @@ public class RyaAdminCommands implements CommandMarker {
             while(!verified) {
                 // Use the install prompt to fetch the user's installation options.
                 instanceName = installPrompt.promptInstanceName();
-                installConfig = installPrompt.promptInstallConfiguration();
+                installConfig = installPrompt.promptInstallConfiguration(instanceName);
 
                 // Verify the configuration is what the user actually wants to do.
                 verified = installPrompt.promptVerified(instanceName, installConfig);
@@ -200,8 +201,65 @@ public class RyaAdminCommands implements CommandMarker {
         }
     }
 
-    @CliCommand(value = GET_INSTANCE_DETAILS_CMD, help = "Print information about how the Rya instance is configured.")
-    public String getInstanceDetails() {
+    @CliCommand(value = INSTALL_PARAMETERS_CMD, help = "Create a new instance of Rya with command line parameters.")
+    public String installWithParameters(
+            @CliOption(key = {"instanceName"}, mandatory = true, help = "The name of the Rya instance to create.")
+            final String instanceName,
+
+            @CliOption(key = {"enableTableHashPrefix"}, mandatory = false, help = "Use Shard Balancing (improves streamed input write speeds).", unspecifiedDefaultValue = "false", specifiedDefaultValue = "true")
+            final boolean enableTableHashPrefix,
+
+            @CliOption(key = {"enableEntityCentricIndex"}, mandatory = false, help = "Use Entity Centric Indexing.", unspecifiedDefaultValue = "false", specifiedDefaultValue = "true")
+            final boolean enableEntityCentricIndex,
+
+            @CliOption(key = {"enableFreeTextIndex"}, mandatory = false, help = "Use Free Text Indexing.", unspecifiedDefaultValue = "false", specifiedDefaultValue = "true")
+            final boolean enableFreeTextIndex,
+
+            @CliOption(key = {"enableGeospatialIndex"}, mandatory = false, help = "Use Geospatial Indexing.", unspecifiedDefaultValue = "false", specifiedDefaultValue = "true")
+            final boolean enableGeospatialIndex,
+
+            @CliOption(key = {"enableTemporalIndex"}, mandatory = false, help = "Use Temporal Indexing.", unspecifiedDefaultValue = "false", specifiedDefaultValue = "true")
+            final boolean enableTemporalIndex,
+
+            @CliOption(key = {"enablePcjIndex"}, mandatory = false, help = "Use Precomputed Join (PCJ) Indexing.", unspecifiedDefaultValue = "false", specifiedDefaultValue = "true")
+            final boolean enablePcjIndex,
+
+            @CliOption(key = {"fluoPcjAppName"}, mandatory = false, help = "Fluo Application Name for PCJ Index Updater (fluo app must be initialized and enablePcjIndex=true).")
+            final String fluoPcjAppName
+            ) {
+
+        // Fetch the commands that are connected to the store.
+        final RyaClient commands = state.getShellState().getConnectedCommands().get();
+
+        try {
+            final InstallConfiguration installConfig = InstallConfiguration.builder()
+                    .setEnableTableHashPrefix(enableTableHashPrefix)
+                    .setEnableEntityCentricIndex(enableEntityCentricIndex)
+                    .setEnableFreeTextIndex(enableFreeTextIndex)
+                    .setEnableGeoIndex(enableGeospatialIndex)
+                    .setEnableTemporalIndex(enableTemporalIndex)
+                    .setEnablePcjIndex(enablePcjIndex)
+                    .setFluoPcjAppName(fluoPcjAppName)
+                    .build();
+
+            // Verify the configuration is what the user actually wants to do.
+            if (!installPrompt.promptVerified(instanceName, installConfig)) {
+                return "Skipping Installation.";
+            }
+
+            // Execute the command.
+            commands.getInstall().install(instanceName, installConfig);
+            return String.format("The Rya instance named '%s' has been installed.", instanceName);
+
+        } catch(final DuplicateInstanceNameException e) {
+            throw new RuntimeException(String.format("A Rya instance named '%s' already exists. Try again with a different name.", instanceName), e);
+        } catch (final IOException | RyaClientException e) {
+            throw new RuntimeException("Could not install a new instance of Rya. Reason: " + e.getMessage(), e);
+        }
+    }
+
+    @CliCommand(value = PRINT_INSTANCE_DETAILS_CMD, help = "Print information about how the Rya instance is configured.")
+    public String printInstanceDetails() {
         // Fetch the command that is connected to the store.
         final ShellState shellState = state.getShellState();
         final RyaClient commands = shellState.getConnectedCommands().get();
@@ -230,11 +288,15 @@ public class RyaAdminCommands implements CommandMarker {
 
         try {
             // Prompt the user for the SPARQL.
-            final String sparql = sparqlPrompt.getSparql();
-            // Execute the command.
-            final String pcjId = commands.getCreatePCJ().createPCJ(ryaInstance, sparql);
-            // Return a message that indicates the ID of the newly created ID.
-            return String.format("The PCJ has been created. Its ID is '%s'.", pcjId);
+            final Optional<String> sparql = sparqlPrompt.getSparql();
+            if (sparql.isPresent()) {
+                // Execute the command.
+                final String pcjId = commands.getCreatePCJ().createPCJ(ryaInstance, sparql.get());
+                // Return a message that indicates the ID of the newly created ID.
+                return String.format("The PCJ has been created. Its ID is '%s'.", pcjId);
+            } else {
+                return ""; // user aborted the SPARQL prompt.
+            }
         } catch (final InstanceDoesNotExistException e) {
             throw new RuntimeException(String.format("A Rya instance named '%s' does not exist.", ryaInstance), e);
         } catch (final IOException | RyaClientException e) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/java/org/apache/rya/shell/RyaCommands.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/org/apache/rya/shell/RyaCommands.java b/extras/rya.console/src/main/java/org/apache/rya/shell/RyaCommands.java
new file mode 100644
index 0000000..09ee410
--- /dev/null
+++ b/extras/rya.console/src/main/java/org/apache/rya/shell/RyaCommands.java
@@ -0,0 +1,166 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.rya.shell;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.text.DecimalFormat;
+import java.util.Objects;
+
+import org.apache.rya.api.client.RyaClient;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.shell.SharedShellState.ShellState;
+import org.apache.rya.shell.util.ConsolePrinter;
+import org.apache.rya.shell.util.SparqlPrompt;
+import org.openrdf.rio.RDFFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.shell.core.CommandMarker;
+import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.shell.core.annotation.CliOption;
+import org.springframework.stereotype.Component;
+
+import com.google.common.base.Optional;
+
+/**
+ * Rya Shell commands that have to do with common tasks (loading and querying data)
+ */
+@Component
+public class RyaCommands implements CommandMarker {
+
+    private static final Logger log = LoggerFactory.getLogger(RyaCommands.class);
+
+    public static final String LOAD_DATA_CMD = "load-data";
+    public static final String SPARQL_QUERY_CMD = "sparql-query";
+
+    private final SharedShellState state;
+    private final SparqlPrompt sparqlPrompt;
+    private final ConsolePrinter consolePrinter;
+
+    /**
+     * Constructs an instance of {@link RyaCommands}.
+     *
+     * @param state - Holds shared state between all of the command classes. (not null)
+     * @param sparqlPrompt - Prompts a user for a SPARQL query. (not null)
+     * @param consolePrinter - Allows the command to print feedback to the user. (not null)
+     */
+    @Autowired
+    public RyaCommands(final SharedShellState state, final SparqlPrompt sparqlPrompt,
+            final ConsolePrinter consolePrinter) {
+        this.state = Objects.requireNonNull(state);
+        this.sparqlPrompt = requireNonNull(sparqlPrompt);
+        this.consolePrinter = Objects.requireNonNull(consolePrinter);
+    }
+
+    /**
+     * Enables commands that are always available once the Shell is connected to a Rya Instance.
+     */
+    @CliAvailabilityIndicator({ LOAD_DATA_CMD, SPARQL_QUERY_CMD })
+    public boolean areInstanceCommandsAvailable() {
+        switch (state.getShellState().getConnectionState()) {
+        case CONNECTED_TO_INSTANCE:
+            return true;
+        default:
+            return false;
+        }
+    }
+
+    @CliCommand(value = LOAD_DATA_CMD, help = "Loads RDF Statement data from a local file to the connected Rya instance.")
+    public String loadData(
+            @CliOption(key = { "file" }, mandatory = true, help = "A local file containing RDF Statements that is to be loaded.")
+            final String file,
+            @CliOption(key = { "format" }, mandatory = false, help = "The format of the supplied RDF Statements file. [RDF/XML, N-Triples, Turtle, N3, TriX, TriG, BinaryRDF, N-Quads, JSON-LD, RDF/JSON, RDFa]")
+            final String format
+            ) {
+        // Fetch the command that is connected to the store.
+        final ShellState shellState = state.getShellState();
+        final RyaClient commands = shellState.getConnectedCommands().get();
+        final Optional<String> ryaInstanceName = shellState.getRyaInstanceName();
+        try {
+            final long start = System.currentTimeMillis();
+            final File rdfInputFile = new File(file);
+
+            RDFFormat rdfFormat = null;
+            if (format != null) {
+                rdfFormat = RDFFormat.valueOf(format);
+                if (rdfFormat == null) {
+                    throw new RuntimeException("Unsupported RDF Statement data input format: " + format);
+                }
+            }
+            if (rdfFormat == null) {
+                rdfFormat = RDFFormat.forFileName(rdfInputFile.getName());
+                if (rdfFormat == null) {
+                    throw new RuntimeException("Unable to detect RDF Statement data input format for file: " + rdfInputFile);
+                } else {
+                    consolePrinter.println("Detected RDF Format: " + rdfFormat);
+                    consolePrinter.flush();
+                }
+            }
+            commands.getLoadStatementsFile().loadStatements(ryaInstanceName.get(), rdfInputFile.toPath(), rdfFormat);
+
+            final String seconds = new DecimalFormat("0.0##").format((System.currentTimeMillis() - start) / 1000.0);
+            return "Loaded the file: '" + file + "' successfully in " + seconds + " seconds.";
+
+        } catch (final RyaClientException | IOException e) {
+            log.error("Error", e);
+            throw new RuntimeException("Can not load the RDF Statement data. Reason: " + e.getMessage(), e);
+        }
+    }
+
+    @CliCommand(value = SPARQL_QUERY_CMD, help = "Executes the provided SPARQL Query on the connected Rya instance.")
+    public String sparqlQuery(
+            @CliOption(key = { "file" }, mandatory = false, help = "A local file containing the SPARQL Query that is to be read and executed.")
+            final String file) {
+        // Fetch the command that is connected to the store.
+        final ShellState shellState = state.getShellState();
+        final RyaClient commands = shellState.getConnectedCommands().get();
+        final Optional<String> ryaInstanceName = shellState.getRyaInstanceName();
+
+        try {
+            // file option specified
+            String sparqlQuery;
+            if (file != null) {
+                sparqlQuery = new String(Files.readAllBytes(new File(file).toPath()), StandardCharsets.UTF_8);
+                consolePrinter.println("Loaded Query:");
+                consolePrinter.println(sparqlQuery);
+            } else {
+                // No Options specified. Show the user the SPARQL Prompt
+                final Optional<String> sparqlQueryOpt = sparqlPrompt.getSparql();
+                if (sparqlQueryOpt.isPresent()) {
+                    sparqlQuery = sparqlQueryOpt.get();
+                } else {
+                    return ""; // user aborted the SPARQL prompt.
+                }
+            }
+
+            consolePrinter.println("Executing Query...");
+            consolePrinter.flush();
+            return commands.getExecuteSparqlQuery().executeSparqlQuery(ryaInstanceName.get(), sparqlQuery);
+        } catch (final RyaClientException | IOException e) {
+            log.error("Error", e);
+            throw new RuntimeException("Can not execute the SPARQL Query. Reason: " + e.getMessage(), e);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/java/org/apache/rya/shell/RyaConnectionCommands.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/org/apache/rya/shell/RyaConnectionCommands.java b/extras/rya.console/src/main/java/org/apache/rya/shell/RyaConnectionCommands.java
index a5debc2..f5ba451 100644
--- a/extras/rya.console/src/main/java/org/apache/rya/shell/RyaConnectionCommands.java
+++ b/extras/rya.console/src/main/java/org/apache/rya/shell/RyaConnectionCommands.java
@@ -26,6 +26,14 @@ import java.nio.CharBuffer;
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
+import org.apache.rya.api.client.InstanceExists;
+import org.apache.rya.api.client.RyaClient;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.api.client.accumulo.AccumuloConnectionDetails;
+import org.apache.rya.api.client.accumulo.AccumuloRyaClientFactory;
+import org.apache.rya.shell.SharedShellState.ConnectionState;
+import org.apache.rya.shell.util.ConnectorFactory;
+import org.apache.rya.shell.util.PasswordPrompt;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.shell.core.CommandMarker;
 import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
@@ -35,15 +43,6 @@ import org.springframework.stereotype.Component;
 
 import com.google.common.base.Optional;
 
-import org.apache.rya.api.client.InstanceExists;
-import org.apache.rya.api.client.RyaClientException;
-import org.apache.rya.api.client.RyaClient;
-import org.apache.rya.api.client.accumulo.AccumuloConnectionDetails;
-import org.apache.rya.api.client.accumulo.AccumuloRyaClientFactory;
-import org.apache.rya.shell.SharedShellState.ConnectionState;
-import org.apache.rya.shell.util.ConnectorFactory;
-import org.apache.rya.shell.util.PasswordPrompt;
-
 /**
  * Spring Shell commands that manage the connection that is used by the shell.
  */
@@ -53,7 +52,7 @@ public class RyaConnectionCommands implements CommandMarker {
     // Command line commands.
     public static final String PRINT_CONNECTION_DETAILS_CMD = "print-connection-details";
     public static final String CONNECT_ACCUMULO_CMD = "connect-accumulo";
-    public static final String CONNECT_INSTANCE_CMD = "connect-to-instance";
+    public static final String CONNECT_INSTANCE_CMD = "connect-rya";
     public static final String DISCONNECT_COMMAND_NAME_CMD = "disconnect";
 
     private final SharedShellState sharedState;
@@ -139,9 +138,9 @@ public class RyaConnectionCommands implements CommandMarker {
         return "Connected. You must select a Rya instance to interact with next.";
     }
 
-    @CliCommand(value = CONNECT_INSTANCE_CMD, help = "Connect to a specific ")
+    @CliCommand(value = CONNECT_INSTANCE_CMD, help = "Connect to a specific Rya instance")
     public void connectToInstance(
-            @CliOption(key = {"instance"}, mandatory = true, help = "The name of the Rya Instance the shell will interact with.")
+            @CliOption(key = {"instance"}, mandatory = true, help = "The name of the Rya instance the shell will interact with.")
             final String instance) {
         try {
             final InstanceExists instanceExists = sharedState.getShellState().getConnectedCommands().get().getInstanceExists();
@@ -160,7 +159,7 @@ public class RyaConnectionCommands implements CommandMarker {
         sharedState.connectedToInstance(instance);
     }
 
-    @CliCommand(value = DISCONNECT_COMMAND_NAME_CMD, help = "Disconnect the shell from the Rya storage it is connect to.")
+    @CliCommand(value = DISCONNECT_COMMAND_NAME_CMD, help = "Disconnect the shell's Rya storage connection (Accumulo).")
     public void disconnect() {
         sharedState.disconnected();
     }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/java/org/apache/rya/shell/RyaShellHistoryProvider.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/org/apache/rya/shell/RyaShellHistoryProvider.java b/extras/rya.console/src/main/java/org/apache/rya/shell/RyaShellHistoryProvider.java
new file mode 100644
index 0000000..b4ade8f
--- /dev/null
+++ b/extras/rya.console/src/main/java/org/apache/rya/shell/RyaShellHistoryProvider.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.rya.shell;
+
+import java.io.File;
+
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.shell.plugin.HistoryFileNameProvider;
+import org.springframework.stereotype.Component;
+
+/**
+ * Customizes the Rya Shell's history file.
+ */
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class RyaShellHistoryProvider implements HistoryFileNameProvider {
+
+    public static final String RYA_SHELL_HISTORY_FILENAME = ".rya_shell_history";
+
+    @Override
+    public String getHistoryFileName() {
+        final String userHome = System.getProperty("user.home");
+        if(userHome == null) {
+            return RYA_SHELL_HISTORY_FILENAME;
+        } else {
+            return new File(userHome, RYA_SHELL_HISTORY_FILENAME).getAbsolutePath();
+        }
+    }
+
+    @Override
+    public String getProviderName() {
+        return this.getClass().getSimpleName();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/java/org/apache/rya/shell/util/ConsolePrinter.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/org/apache/rya/shell/util/ConsolePrinter.java b/extras/rya.console/src/main/java/org/apache/rya/shell/util/ConsolePrinter.java
new file mode 100644
index 0000000..4492a87
--- /dev/null
+++ b/extras/rya.console/src/main/java/org/apache/rya/shell/util/ConsolePrinter.java
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.rya.shell.util;
+
+import java.io.IOException;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+import jline.console.ConsoleReader;
+
+/**
+ * A mechanism for printing content to the console.
+ */
+@DefaultAnnotation(NonNull.class)
+public interface ConsolePrinter {
+
+    /**
+     * Prints the provided content to the console.
+     * @param cs - Output the specified String to the console.
+     * @throws IOException There was a problem reading the user's input.
+     */
+    public void print(CharSequence cs) throws IOException;
+
+    /**
+     * Prints the provided content to the console with a newline.
+     * @param cs - Output the specified String to the console.
+     * @throws IOException There was a problem reading the user's input.
+     */
+    public void println(CharSequence cs) throws IOException;
+
+    /**
+     * Prints a newline.
+     * @throws IOException There was a problem reading the user's input.
+     */
+    public void println() throws IOException;
+
+    /**
+     * Flush any pending console updates to the console output stream.
+     * @throws IOException
+     */
+    public void flush() throws IOException;
+
+    /**
+     * Prints to the console using a JLine {@link ConsoleReader}.
+     */
+    @DefaultAnnotation(NonNull.class)
+    public static class JLineConsolePrinter extends JLinePrompt implements ConsolePrinter {
+
+        @Override
+        public void print(final CharSequence cs) throws IOException {
+            getReader().print(cs);
+        }
+
+        @Override
+        public void println(final CharSequence cs) throws IOException {
+            getReader().println(cs);
+        }
+
+        @Override
+        public void println() throws IOException {
+            getReader().println();
+        }
+
+        @Override
+        public void flush() throws IOException {
+            getReader().flush();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fa2aad55/extras/rya.console/src/main/java/org/apache/rya/shell/util/InstallPrompt.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/org/apache/rya/shell/util/InstallPrompt.java b/extras/rya.console/src/main/java/org/apache/rya/shell/util/InstallPrompt.java
index 397deca..5d9d48b 100644
--- a/extras/rya.console/src/main/java/org/apache/rya/shell/util/InstallPrompt.java
+++ b/extras/rya.console/src/main/java/org/apache/rya/shell/util/InstallPrompt.java
@@ -20,10 +20,11 @@ package org.apache.rya.shell.util;
 
 import java.io.IOException;
 
+import org.apache.rya.api.client.Install.InstallConfiguration;
+
 import com.google.common.base.Optional;
 
 import jline.console.ConsoleReader;
-import org.apache.rya.api.client.Install.InstallConfiguration;
 
 /**
  * A mechanism for prompting a user of the application for a the parameters
@@ -42,10 +43,11 @@ public interface InstallPrompt {
     /**
      * Prompt the user for which features of Rya they want enabled.
      *
+     * @param instanceName - The Rya instance name.
      * @return The value they entered.
      * @throws IOException There was a problem reading the values.
      */
-    public InstallConfiguration promptInstallConfiguration() throws IOException;
+    public InstallConfiguration promptInstallConfiguration(String instanceName) throws IOException;
 
     /**
      * Prompt the user asking them if they are sure they would like to do the
@@ -63,14 +65,13 @@ public interface InstallPrompt {
 
         @Override
         public String promptInstanceName() throws IOException {
-            final ConsoleReader reader = getReader();
-            reader.setPrompt("Rya Instance Name: ");
-            final String instanceName = reader.readLine();
+            final String prompt = makeFieldPrompt("Rya Instance Name", "rya_");
+            final String instanceName = promptString(prompt, Optional.of("rya_"));
             return instanceName;
         }
 
         @Override
-        public InstallConfiguration promptInstallConfiguration() throws IOException {
+        public InstallConfiguration promptInstallConfiguration(final String instanceName) throws IOException {
             final InstallConfiguration.Builder builder = InstallConfiguration.builder();
 
             String prompt = makeFieldPrompt("Use Shard Balancing (improves streamed input write speeds)", false);
@@ -89,24 +90,24 @@ public interface InstallPrompt {
             final boolean enableGeoIndexing = promptBoolean(prompt, Optional.of(true));
             builder.setEnableGeoIndex( enableGeoIndexing );
 
+            prompt = makeFieldPrompt("Use Temporal Indexing", true);
+            final boolean useTemporalIndexing = promptBoolean(prompt, Optional.of(true));
+            builder.setEnableTemporalIndex( useTemporalIndexing );
+
             prompt = makeFieldPrompt("Use Precomputed Join Indexing", true);
             final boolean enablePCJIndexing = promptBoolean(prompt, Optional.of(true));
             builder.setEnablePcjIndex( enablePCJIndexing );
 
             if(enablePCJIndexing) {
-                final boolean useFluoApp = promptBoolean("Use a Fluo application to update the PCJ? ", Optional.absent());
+                final boolean useFluoApp = promptBoolean("Use a Fluo application to update the PCJ Index? (y/n) ", Optional.absent());
 
                 if(useFluoApp) {
-                    prompt = "PCJ Updater Fluo Application Name: ";
-                    final String fluoAppName = promptString(prompt, Optional.<String>absent());
+                    prompt = makeFieldPrompt("PCJ Updater Fluo Application Name (must be initialized)", instanceName + "pcj_updater");
+                    final String fluoAppName = promptString(prompt, Optional.of(instanceName + "pcj_updater"));
                     builder.setFluoPcjAppName(fluoAppName);
                 }
             }
 
-            prompt = makeFieldPrompt("Use Temporal Indexing", true);
-            final boolean useTemporalIndexing = promptBoolean(prompt, Optional.of(true));
-            builder.setEnableTemporalIndex( useTemporalIndexing );
-
             return builder.build();
         }
 
@@ -120,7 +121,7 @@ public interface InstallPrompt {
             reader.println("   Use Entity Centric Indexing: " + installConfig.isEntityCentrixIndexEnabled());
             reader.println("   Use Free Text Indexing: " + installConfig.isFreeTextIndexEnabled());
             reader.println("   Use Geospatial Indexing: " + installConfig.isGeoIndexEnabled());
-
+            reader.println("   Use Temporal Indexing: " + installConfig.isTemporalIndexEnabled());
             reader.println("   Use Precomputed Join Indexing: " + installConfig.isPcjIndexEnabled());
             if(installConfig.isPcjIndexEnabled()) {
                 if(installConfig.getFluoPcjAppName().isPresent()) {
@@ -130,10 +131,9 @@ public interface InstallPrompt {
                 }
             }
 
-            reader.println("   Use Temporal Indexing: " + installConfig.isTemporalIndexEnabled());
             reader.println("");
 
-            return promptBoolean("Continue with the install? ", Optional.<Boolean>absent());
+            return promptBoolean("Continue with the install? (y/n) ", Optional.absent());
         }
     }
 }
\ No newline at end of file