You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by mi...@apache.org on 2016/08/23 19:38:50 UTC
[22/34] incubator-rya git commit: Rya-82 Rya Console updated to
incorporate Rya Details for an instance and provide administrative commands.
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/indexingExample/src/main/java/RyaDirectExample.java
----------------------------------------------------------------------
diff --git a/extras/indexingExample/src/main/java/RyaDirectExample.java b/extras/indexingExample/src/main/java/RyaDirectExample.java
index cb69f51..03712ba 100644
--- a/extras/indexingExample/src/main/java/RyaDirectExample.java
+++ b/extras/indexingExample/src/main/java/RyaDirectExample.java
@@ -20,16 +20,6 @@
import java.net.UnknownHostException;
import java.util.List;
-import mvm.rya.accumulo.AccumuloRdfConfiguration;
-import mvm.rya.api.RdfCloudTripleStoreConfiguration;
-import mvm.rya.api.persist.RyaDAOException;
-import mvm.rya.indexing.accumulo.ConfigUtils;
-import mvm.rya.indexing.accumulo.geo.GeoConstants;
-import mvm.rya.indexing.external.PrecomputedJoinIndexerConfig;
-import mvm.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinStorageType;
-import mvm.rya.rdftriplestore.inference.InferenceEngineException;
-import mvm.rya.sail.config.RyaSailFactory;
-
import org.apache.accumulo.core.client.AccumuloException;
import org.apache.accumulo.core.client.AccumuloSecurityException;
import org.apache.accumulo.core.client.Connector;
@@ -63,9 +53,20 @@ 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 com.google.common.base.Optional;
+import mvm.rya.accumulo.AccumuloRdfConfiguration;
+import mvm.rya.api.RdfCloudTripleStoreConfiguration;
+import mvm.rya.api.persist.RyaDAOException;
+import mvm.rya.indexing.accumulo.ConfigUtils;
+import mvm.rya.indexing.accumulo.geo.GeoConstants;
+import mvm.rya.indexing.external.PrecomputedJoinIndexerConfig;
+import mvm.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinStorageType;
+import mvm.rya.rdftriplestore.inference.InferenceEngineException;
+import mvm.rya.sail.config.RyaSailFactory;
+
public class RyaDirectExample {
private static final Logger log = Logger.getLogger(RyaDirectExample.class);
@@ -77,14 +78,13 @@ public class RyaDirectExample {
private static final boolean PRINT_QUERIES = true;
private static final String INSTANCE = "instance";
private static final String RYA_TABLE_PREFIX = "x_test_triplestore_";
- private static final String AUTHS = "";
+ private static final String AUTHS = "U";
public static void main(final String[] args) throws Exception {
final Configuration conf = getConf();
conf.setBoolean(ConfigUtils.DISPLAY_QUERY_PLAN, PRINT_QUERIES);
log.info("Creating the tables as root.");
- // createTables(addRootConf(conf), conf);
SailRepository repository = null;
SailRepositoryConnection conn = null;
@@ -93,7 +93,6 @@ public class RyaDirectExample {
log.info("Connecting to Indexing Sail Repository.");
final Sail extSail = RyaSailFactory.getInstance(conf);
repository = new SailRepository(extSail);
- repository.initialize();
conn = repository.getConnection();
createPCJ(conf);
@@ -731,7 +730,7 @@ public class RyaDirectExample {
throws RepositoryException, AccumuloException,
AccumuloSecurityException, TableExistsException, PcjException,
InferenceEngineException, NumberFormatException,
- UnknownHostException {
+ UnknownHostException, SailException {
final Configuration config = new AccumuloRdfConfiguration(conf);
config.set(ConfigUtils.USE_PCJ, "false");
@@ -739,10 +738,9 @@ public class RyaDirectExample {
SailRepositoryConnection conn = null;
try {
- Sail extSail = RyaSailFactory.getInstance(config);
+ final Sail extSail = RyaSailFactory.getInstance(config);
repository = new SailRepository(extSail);
- repository.initialize();
conn = repository.getConnection();
final String queryString1 = ""//
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/pom.xml
----------------------------------------------------------------------
diff --git a/extras/rya.console/pom.xml b/extras/rya.console/pom.xml
index 1bbb5a0..c2332aa 100644
--- a/extras/rya.console/pom.xml
+++ b/extras/rya.console/pom.xml
@@ -1,26 +1,28 @@
<?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
+ 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
-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://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>
@@ -30,10 +32,6 @@ under the License.
<artifactId>rya.console</artifactId>
<name>Apache Rya Console</name>
- <properties>
- <jar.mainclass>org.springframework.shell.Bootstrap</jar.mainclass>
- </properties>
-
<dependencies>
<dependency>
<groupId>org.apache.rya</groupId>
@@ -49,52 +47,142 @@ under the License.
</exclusion>
</exclusions>
</dependency>
+ <dependency>
+ <groupId>org.apache.rya</groupId>
+ <artifactId>rya.indexing</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.rya</groupId>
+ <artifactId>rya.pcj.fluo.api</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>
+ <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>
+ <version>${accumulo.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>io.fluo</groupId>
+ <artifactId>fluo-mini</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.rya</groupId>
+ <artifactId>accumulo.rya</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
</dependencies>
<build>
<plugins>
+ <!-- Automatically place Apache 2 license headers at the top of all of the project's Java files.
+ Rat runs during the 'validate' lifecycle step, so it will fail the build before this one
+ executes if any of the headers are missing. Run the build with rat turned off to add
+ missing headers to the Java files. -->
+ <plugin>
+ <groupId>com.mycila</groupId>
+ <artifactId>license-maven-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <!-- We use a custome Apache 2.0 license because we do not include a copywrite section. -->
+ <header>src/main/resources/LICENSE.txt</header>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>process-sources</phase>
+ <goals>
+ <goal>format</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- Create an executable jar file for the shell. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>2.0</version>
<executions>
<execution>
- <id>copy-dependencies</id>
- <phase>prepare-package</phase>
+ <phase>package</phase>
<goals>
- <goal>copy-dependencies</goal>
+ <goal>shade</goal>
</goals>
<configuration>
- <outputDirectory>${project.build.directory}/lib</outputDirectory>
- <overWriteReleases>true</overWriteReleases>
- <overWriteSnapshots>true</overWriteSnapshots>
- <overWriteIfNewer>true</overWriteIfNewer>
+ <transformers>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+ <resource>META-INF/spring.handlers</resource>
+ </transformer>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+ <resource>META-INF/spring.schemas</resource>
+ </transformer>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+ <mainClass>org.springframework.shell.Bootstrap</mainClass>
+ </transformer>
+ </transformers>
</configuration>
</execution>
</executions>
</plugin>
+
+ <!-- Run integration tests. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <configuration>
- <archive>
- <manifest>
- <addClasspath>true</addClasspath>
- <!--<useUniqueVersions>false</useUniqueVersions> -->
- <classpathPrefix>lib/</classpathPrefix>
- <mainClass>${jar.mainclass}</mainClass>
- </manifest>
- <manifestEntries>
- <version>${project.version}</version>
- </manifestEntries>
- </archive>
- </configuration>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </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>
+ <goals>
+ <goal>prepare-agent</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>default-report</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>report</goal>
+ </goals>
+ </execution>
+ </executions>
</plugin>
</plugins>
-
</build>
-</project>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/console/RyaBannerProvider.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/console/RyaBannerProvider.java b/extras/rya.console/src/main/java/mvm/rya/console/RyaBannerProvider.java
deleted file mode 100644
index 2d0fac8..0000000
--- a/extras/rya.console/src/main/java/mvm/rya/console/RyaBannerProvider.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package mvm.rya.console;
-
-/*
- * 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.
- */
-
-
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.shell.core.CommandMarker;
-import org.springframework.shell.core.annotation.CliCommand;
-import org.springframework.shell.plugin.support.DefaultBannerProvider;
-import org.springframework.shell.support.util.OsUtils;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Jarred Li
- */
-@Component
-@Order(Ordered.HIGHEST_PRECEDENCE)
-public class RyaBannerProvider extends DefaultBannerProvider
- implements CommandMarker {
-
- @CliCommand(value = {"version"}, help = "Displays current CLI version")
- @Override
- public String getBanner() {
- StringBuffer buf = new StringBuffer();
- buf.append("" +
- "________ _________ ______ \n" +
- "___ __ \\____ _______ _ __ ____/____________________________ /____ \n" +
- "__ /_/ /_ / / / __ `/ _ / _ __ \\_ __ \\_ ___/ __ \\_ /_ _ \\\n" +
- "_ _, _/_ /_/ // /_/ / / /___ / /_/ / / / /(__ )/ /_/ / / / __/\n" +
- "/_/ |_| _\\__, / \\__,_/ \\____/ \\____//_/ /_//____/ \\____//_/ \\___/ \n" +
- " /____/ " + OsUtils.LINE_SEPARATOR);
- buf.append("Version:" + this.getVersion());
- return buf.toString();
-
- }
-
- @Override
- public String getVersion() {
- return "3.0.0";
- }
-
- @Override
- public String getWelcomeMessage() {
- return "Welcome to the Rya Console";
- }
-
- @Override
- public String getProviderName() {
- return "rya";
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/console/RyaConsoleCommands.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/console/RyaConsoleCommands.java b/extras/rya.console/src/main/java/mvm/rya/console/RyaConsoleCommands.java
deleted file mode 100644
index 3f63b20..0000000
--- a/extras/rya.console/src/main/java/mvm/rya/console/RyaConsoleCommands.java
+++ /dev/null
@@ -1,230 +0,0 @@
-package mvm.rya.console;
-
-/*
- * 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.
- */
-
-
-import info.aduna.iteration.CloseableIteration;
-
-import java.io.FileInputStream;
-import java.io.StringReader;
-import java.util.Formatter;
-import java.util.Locale;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import mvm.rya.accumulo.AccumuloRdfConfiguration;
-import mvm.rya.accumulo.AccumuloRyaDAO;
-import mvm.rya.api.RdfCloudTripleStoreConfiguration;
-import mvm.rya.api.domain.RyaStatement;
-import mvm.rya.api.domain.RyaURI;
-import mvm.rya.api.persist.RyaDAO;
-import mvm.rya.api.persist.RyaDAOException;
-import mvm.rya.api.persist.query.RyaQueryEngine;
-import mvm.rya.api.resolver.RdfToRyaConversions;
-import mvm.rya.api.resolver.RyaContext;
-
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.ZooKeeperInstance;
-import org.apache.accumulo.core.client.mock.MockInstance;
-import org.openrdf.model.Statement;
-import org.openrdf.rio.RDFHandler;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.RDFParser;
-import org.openrdf.rio.ntriples.NTriplesParserFactory;
-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;
-
-@Component
-public class RyaConsoleCommands implements CommandMarker {
-
- private static final NTriplesParserFactory N_TRIPLES_PARSER_FACTORY = new NTriplesParserFactory();
-
- protected final Logger LOG = Logger.getLogger(getClass().getName());
-
- private RyaContext ryaContext = RyaContext.getInstance();
- private RyaDAO ryaDAO;
- private RDFParser ntrips_parser = null;
-
- public RyaConsoleCommands() {
- ntrips_parser = N_TRIPLES_PARSER_FACTORY.getParser();
- ntrips_parser.setRDFHandler(new RDFHandler() {
-
- public void startRDF() throws RDFHandlerException {
-
- }
-
- public void endRDF() throws RDFHandlerException {
-
- }
-
- public void handleNamespace(String s, String s1) throws RDFHandlerException {
-
- }
-
- public void handleStatement(Statement statement) throws RDFHandlerException {
- try {
- RyaStatement ryaStatement = RdfToRyaConversions.convertStatement(statement);
- ryaDAO.add(ryaStatement);
- } catch (Exception e) {
- throw new RDFHandlerException(e);
- }
- }
-
- public void handleComment(String s) throws RDFHandlerException {
-
- }
- });
- }
-
- /**
- * commands:
- * 1. connect(instance, user, password, zk)
- * 1.a. disconnect
- * 2. query
- * 3. add
- */
-
- @CliAvailabilityIndicator({"connect"})
- public boolean isConnectAvailable() {
- return true;
- }
-
- @CliAvailabilityIndicator({"qt", "add", "load", "disconnect"})
- public boolean isCommandAvailable() {
- return ryaDAO != null;
- }
-
- @CliCommand(value = "qt", help = "Query with Triple Pattern")
- public String queryTriple(
- @CliOption(key = {"subject"}, mandatory = false, help = "Subject") final String subject,
- @CliOption(key = {"predicate"}, mandatory = false, help = "Predicate") final String predicate,
- @CliOption(key = {"object"}, mandatory = false, help = "Object") final String object,
- @CliOption(key = {"context"}, mandatory = false, help = "Context") final String context,
- @CliOption(key = {"maxResults"}, mandatory = false, help = "Maximum Number of Results", unspecifiedDefaultValue = "100") final String maxResults
- ) {
- try {
- RdfCloudTripleStoreConfiguration conf = ryaDAO.getConf().clone();
- if (maxResults != null) {
- conf.setLimit(Long.parseLong(maxResults));
- }
- RyaQueryEngine queryEngine = ryaDAO.getQueryEngine();
- CloseableIteration<RyaStatement, RyaDAOException> query =
- queryEngine.query(new RyaStatement(
- (subject != null) ? (new RyaURI(subject)) : null,
- (predicate != null) ? (new RyaURI(predicate)) : null,
- (object != null) ? (new RyaURI(object)) : null,
- (context != null) ? (new RyaURI(context)) : null), conf);
- StringBuilder sb = new StringBuilder();
- Formatter formatter = new Formatter(sb, Locale.US);
- String format = "%-40s %-40s %-40s %-40s\n";
- formatter.format(format, "Subject", "Predicate",
- "Object", "Context");
- while (query.hasNext()) {
- RyaStatement next = query.next();
- formatter.format(format, next.getSubject().getData(), next.getPredicate().getData(),
- next.getObject().getData(), (next.getContext() != null) ? (next.getContext().getData()) : (null));
- sb.append("\n");
- }
- return sb.toString();
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "", e);
- }
- return "";
- }
-
- @CliCommand(value = "load", help = "Load file")
- public void load(
- @CliOption(key = {"", "file"}, mandatory = true, help = "File of ntriples rdf to load") final String file
- ) {
- //diff formats?
- //diff types of urls
- try {
- ntrips_parser.parse(new FileInputStream(file), "");
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "", e);
- }
- }
-
- @CliCommand(value = "add", help = "Add Statement")
- public void add(
- @CliOption(key = {"", "statement"}, mandatory = true, help = "Statement in NTriples format") final String statement) {
- try {
- ntrips_parser.parse(new StringReader(statement), "");
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "", e);
- }
- }
-
- @CliCommand(value = "connect", help = "Connect to Rya Triple Store")
- public String connect(
- @CliOption(key = {"instance"}, mandatory = true, help = "Accumulo Instance") final String instance,
- @CliOption(key = {"user"}, mandatory = true, help = "Accumulo User") final String user,
- @CliOption(key = {"pwd"}, mandatory = true, help = "Accumulo Pwd") final String pwd,
- @CliOption(key = {"zk"}, mandatory = true, help = "Accumulo Zk (zk=mock for the mock instance)") final String zk,
- @CliOption(key = {"pre"}, mandatory = false, help = "Accumulo table prefix", unspecifiedDefaultValue = "rya_") final String pre) {
- try {
- //using Cloudbase
- Connector connector = null;
- AccumuloRyaDAO cryaDao = new AccumuloRyaDAO();
- if ("mock".equals(zk)) {
- //mock instance
- connector = new MockInstance(instance).getConnector(user, pwd);
- } else {
- connector = new ZooKeeperInstance(instance, zk).getConnector(user, pwd);
- }
-
- cryaDao.setConnector(connector);
- AccumuloRdfConfiguration configuration = new AccumuloRdfConfiguration();
- configuration.setTablePrefix(pre);
- cryaDao.setConf(configuration);
- cryaDao.init();
- this.ryaDAO = cryaDao;
- return "Connected to Accumulo";
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "", e);
- }
- return "";
- }
-
- @CliCommand(value = "disconnect", help = "Disconnect from Rya Store")
- public String disconnect() {
- if (ryaDAO == null) {
- return "Command is not available because Rya is not connected. Please 'connect' first.";
- }
- try {
- this.ryaDAO.destroy();
- this.ryaDAO = null;
- } catch (RyaDAOException e) {
- LOG.log(Level.SEVERE, "", e);
- }
- return "";
- }
-
- public RyaDAO getRyaDAO() {
- return ryaDAO;
- }
-
- public void setRyaDAO(RyaDAO ryaDAO) {
- this.ryaDAO = ryaDAO;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/console/RyaHistoryFileNameProvider.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/console/RyaHistoryFileNameProvider.java b/extras/rya.console/src/main/java/mvm/rya/console/RyaHistoryFileNameProvider.java
deleted file mode 100644
index 97182aa..0000000
--- a/extras/rya.console/src/main/java/mvm/rya/console/RyaHistoryFileNameProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package mvm.rya.console;
-
-/*
- * 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.
- */
-
-
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.shell.plugin.support.DefaultHistoryFileNameProvider;
-import org.springframework.stereotype.Component;
-
-/**
- *
- * @author Jarred Li
- *
- */
-@Component
-@Order(Ordered.HIGHEST_PRECEDENCE)
-public class RyaHistoryFileNameProvider extends DefaultHistoryFileNameProvider{
-
- @Override
- public String getHistoryFileName() {
- return "ryaconsole.log";
- }
-
- @Override
- public String getProviderName() {
- return "Rya Console History Log";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/console/RyaPromptProvider.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/console/RyaPromptProvider.java b/extras/rya.console/src/main/java/mvm/rya/console/RyaPromptProvider.java
deleted file mode 100644
index b199819..0000000
--- a/extras/rya.console/src/main/java/mvm/rya/console/RyaPromptProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package mvm.rya.console;
-
-/*
- * 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.
- */
-
-
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.shell.plugin.support.DefaultPromptProvider;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Jarred Li
- *
- */
-@Component
-@Order(Ordered.HIGHEST_PRECEDENCE)
-public class RyaPromptProvider extends DefaultPromptProvider {
-
- @Override
- public String getPrompt() {
- return "rya>";
- }
-
-
- @Override
- public String getProviderName() {
- return "Rya Console Prompt";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/shell/RyaAdminCommands.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/shell/RyaAdminCommands.java b/extras/rya.console/src/main/java/mvm/rya/shell/RyaAdminCommands.java
new file mode 100644
index 0000000..bd91333
--- /dev/null
+++ b/extras/rya.console/src/main/java/mvm/rya/shell/RyaAdminCommands.java
@@ -0,0 +1,254 @@
+/**
+ * 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 mvm.rya.shell;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+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;
+
+import mvm.rya.api.client.RyaClientException;
+import mvm.rya.api.client.RyaClient;
+import mvm.rya.api.client.GetInstanceDetails;
+import mvm.rya.api.client.InstanceDoesNotExistException;
+import mvm.rya.api.client.Install.DuplicateInstanceNameException;
+import mvm.rya.api.client.Install.InstallConfiguration;
+import mvm.rya.api.instance.RyaDetails;
+import mvm.rya.shell.SharedShellState.ConnectionState;
+import mvm.rya.shell.SharedShellState.ShellState;
+import mvm.rya.shell.util.InstallPrompt;
+import mvm.rya.shell.util.InstanceNamesFormatter;
+import mvm.rya.shell.util.RyaDetailsFormatter;
+import mvm.rya.shell.util.SparqlPrompt;
+
+/**
+ * Rya Shell commands that have to do with administrative tasks.
+ */
+@Component
+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 INSTALL_CMD = "install";
+ public static final String LIST_INSTANCES_CMD = "list-instances";
+ public static final String UNINSTALL_CMD = "uninstall";
+
+ private final SharedShellState state;
+ private final InstallPrompt installPrompt;
+ private final SparqlPrompt sparqlPrompt;
+
+ /**
+ * Constructs an instance of {@link RyaAdminCommands}.
+ *
+ * @param state - Holds shared state between all of the command classes. (not null)
+ * @param installPrompt - Prompts a user for installation details. (not null)
+ * @param sparqlPrompt - TODO doc
+ */
+ @Autowired
+ public RyaAdminCommands(final SharedShellState state, final InstallPrompt installPrompt, final SparqlPrompt sparqlPrompt) {
+ this.state = requireNonNull( state );
+ this.installPrompt = requireNonNull(installPrompt);
+ this.sparqlPrompt = requireNonNull(sparqlPrompt);
+ }
+
+ /**
+ * Enables commands that only become available once the Shell has been connected to a Rya Storage.
+ */
+ @CliAvailabilityIndicator({
+ LIST_INSTANCES_CMD,
+ INSTALL_CMD })
+ public boolean areStorageCommandsAvailable() {
+ switch(state.getShellState().getConnectionState()) {
+ case CONNECTED_TO_STORAGE:
+ case CONNECTED_TO_INSTANCE:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Enables commands that are always available once the Shell is connected to a Rya Instance.
+ */
+ @CliAvailabilityIndicator({
+ GET_INSTANCE_DETAILS_CMD,
+ UNINSTALL_CMD })
+ public boolean areInstanceCommandsAvailable() {
+ switch(state.getShellState().getConnectionState()) {
+ case CONNECTED_TO_INSTANCE:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Enables commands that are available when the Shell is connected to a Rya Instance that supports PCJ Indexing.
+ */
+ @CliAvailabilityIndicator({
+ CREATE_PCJ_CMD,
+ DELETE_PCJ_CMD })
+ public boolean arePCJCommandsAvailable() {
+ // The PCJ commands are only available if the Shell is connected to an instance of Rya
+ // that is new enough to use the RyaDetailsRepository and is configured to maintain PCJs.
+ final ShellState shellState = state.getShellState();
+ if(shellState.getConnectionState() == ConnectionState.CONNECTED_TO_INSTANCE) {
+ final GetInstanceDetails getInstanceDetails = shellState.getConnectedCommands().get().getGetInstanceDetails();
+ final String ryaInstanceName = state.getShellState().getRyaInstanceName().get();
+ try {
+ final Optional<RyaDetails> instanceDetails = getInstanceDetails.getDetails( ryaInstanceName );
+ if(instanceDetails.isPresent()) {
+ return instanceDetails.get().getPCJIndexDetails().isEnabled();
+ }
+ } catch (final RyaClientException e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @CliCommand(value = LIST_INSTANCES_CMD, help = "List the names of the installed Rya instances.")
+ public String listInstances() {
+ // Fetch the command that is connected to the store.
+ final ShellState shellState = state.getShellState();
+ final RyaClient commands = shellState.getConnectedCommands().get();
+ final Optional<String> ryaInstance = shellState.getRyaInstanceName();
+
+ try {
+ // Sort the names alphabetically.
+ final List<String> instanceNames = commands.getListInstances().listInstances();
+ Collections.sort( instanceNames );
+
+ final String report;
+ final InstanceNamesFormatter formatter = new InstanceNamesFormatter();
+ if(ryaInstance.isPresent()) {
+ report = formatter.format(instanceNames, ryaInstance.get());
+ } else {
+ report = formatter.format(instanceNames);
+ }
+ return report;
+
+ } catch (final RyaClientException e) {
+ throw new RuntimeException("Can not list the Rya instances. Reason: " + e.getMessage(), e);
+ }
+ }
+
+ @CliCommand(value = INSTALL_CMD, help = "Create a new instance of Rya.")
+ public String install() {
+ // Fetch the commands that are connected to the store.
+ final RyaClient commands = state.getShellState().getConnectedCommands().get();
+
+ String instanceName = null;
+ InstallConfiguration installConfig = null;
+ try {
+ boolean verified = false;
+ while(!verified) {
+ // Use the install prompt to fetch the user's installation options.
+ instanceName = installPrompt.promptInstanceName();
+ installConfig = installPrompt.promptInstallConfiguration();
+
+ // Verify the configuration is what the user actually wants to do.
+ verified = installPrompt.promptVerified(instanceName, installConfig);
+ }
+
+ // 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 = GET_INSTANCE_DETAILS_CMD, help = "Print information about how the Rya instance is configured.")
+ public String getInstanceDetails() {
+ // Fetch the command that is connected to the store.
+ final ShellState shellState = state.getShellState();
+ final RyaClient commands = shellState.getConnectedCommands().get();
+ final String ryaInstance = shellState.getRyaInstanceName().get();
+
+ try {
+ final Optional<RyaDetails> details = commands.getGetInstanceDetails().getDetails(ryaInstance);
+ if(details.isPresent()) {
+ return new RyaDetailsFormatter().format(details.get());
+ } else {
+ return "This instance of Rya does not have a Rya Details table. Consider migrating to a newer version of Rya.";
+ }
+ } catch(final InstanceDoesNotExistException e) {
+ throw new RuntimeException(String.format("A Rya instance named '%s' does not exist.", ryaInstance), e);
+ } catch (final RyaClientException e) {
+ throw new RuntimeException("Could not get the instance details. Reason: " + e.getMessage(), e);
+ }
+ }
+
+ @CliCommand(value = CREATE_PCJ_CMD, help = "Creates and starts the maintenance of a new PCJ using a Fluo application.")
+ public String createPcj() {
+ // Fetch the command that is connected to the store.
+ final ShellState shellState = state.getShellState();
+ final RyaClient commands = shellState.getConnectedCommands().get();
+ final String ryaInstance = shellState.getRyaInstanceName().get();
+
+ 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);
+ } catch (final InstanceDoesNotExistException e) {
+ throw new RuntimeException(String.format("A Rya instance named '%s' does not exist.", ryaInstance), e);
+ } catch (final IOException | RyaClientException e) {
+ throw new RuntimeException("Could not create the PCJ. Provided reasons: " + e.getMessage(), e);
+ }
+ }
+
+ @CliCommand(value = DELETE_PCJ_CMD, help = "Deletes and halts maintenance of a PCJ.")
+ public String deletePcj(
+ @CliOption(key = {"pcjId"}, mandatory = true, help = "The ID of the PCJ that will be deleted.")
+ final String pcjId) {
+ // Fetch the command that is connected to the store.
+ final ShellState shellState = state.getShellState();
+ final RyaClient commands = shellState.getConnectedCommands().get();
+ final String ryaInstance = shellState.getRyaInstanceName().get();
+
+ try {
+ // Execute the command.
+ commands.getDeletePCJ().deletePCJ(ryaInstance, pcjId);
+ return "The PCJ has been deleted.";
+
+ } catch (final InstanceDoesNotExistException e) {
+ throw new RuntimeException(String.format("A Rya instance named '%s' does not exist.", ryaInstance), e);
+ } catch (final RyaClientException e) {
+ throw new RuntimeException("The PCJ could not be deleted. Provided reason: " + e.getMessage(), e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/shell/RyaBannerProvider.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/shell/RyaBannerProvider.java b/extras/rya.console/src/main/java/mvm/rya/shell/RyaBannerProvider.java
new file mode 100644
index 0000000..cdd706c
--- /dev/null
+++ b/extras/rya.console/src/main/java/mvm/rya/shell/RyaBannerProvider.java
@@ -0,0 +1,97 @@
+/**
+ * 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 mvm.rya.shell;
+
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.shell.core.CommandMarker;
+import org.springframework.shell.plugin.support.DefaultBannerProvider;
+import org.springframework.stereotype.Component;
+
+/**
+ * Customizes the Rya Shell's banner.
+ */
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class RyaBannerProvider extends DefaultBannerProvider implements CommandMarker {
+ private final Logger log = LoggerFactory.getLogger(RyaBannerProvider.class);
+
+ private static final String BANNER =
+ " _____ _____ _ _ _ \n" +
+ "| __ \\ / ____| | | | |\n" +
+ "| |__) | _ __ _ | (___ | |__ ___| | |\n" +
+ "| _ / | | |/ _` | \\___ \\| '_ \\ / _ \\ | |\n" +
+ "| | \\ \\ |_| | (_| | ____) | | | | __/ | |\n" +
+ "|_| \\_\\__, |\\__,_| |_____/|_| |_|\\___|_|_|\n" +
+ " __/ | \n" +
+ " |___/ ";
+
+ private String version = null;
+
+ @Override
+ public String getBanner() {
+ return BANNER + "\n" + getVersion() + "\n";
+ }
+
+ @Override
+ public String getWelcomeMessage() {
+ return "Welcome to the Rya Shell.\n" +
+ "\n" +
+ "Execute one of the connect commands to start interacting with an instance of Rya.\n" +
+ "You may press tab at any time to see which of the commands are available.";
+ }
+
+ @Override
+ public String getVersion() {
+ if(version == null) {
+ version = loadVersion();
+ }
+ return version;
+ }
+
+ /**
+ * Loads the version number from the Rya Shell's MANIFEST.MF file.
+ *
+ * @return The version number of the Rya Shell.
+ */
+ private String loadVersion() {
+ final String className = getClass().getSimpleName() + ".class";
+ final String classPath = getClass().getResource( className ).toString();
+
+ try {
+ final URL classUrl = new URL(classPath);
+ final JarURLConnection jarConnection = (JarURLConnection) classUrl.openConnection();
+ final Manifest manifest = jarConnection.getManifest();
+ final Attributes attributes = manifest.getMainAttributes();
+ return attributes.getValue("Implementation-Version");
+ } catch (final IOException e) {
+ log.error("Could not load the application's version from it's manifest.", e);
+ }
+
+ return "UNKNOWN";
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/shell/RyaConnectionCommands.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/shell/RyaConnectionCommands.java b/extras/rya.console/src/main/java/mvm/rya/shell/RyaConnectionCommands.java
new file mode 100644
index 0000000..d305a87
--- /dev/null
+++ b/extras/rya.console/src/main/java/mvm/rya/shell/RyaConnectionCommands.java
@@ -0,0 +1,167 @@
+/**
+ * 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 mvm.rya.shell;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.IOException;
+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.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;
+
+import mvm.rya.api.client.InstanceExists;
+import mvm.rya.api.client.RyaClientException;
+import mvm.rya.api.client.RyaClient;
+import mvm.rya.api.client.accumulo.AccumuloConnectionDetails;
+import mvm.rya.api.client.accumulo.AccumuloRyaClientFactory;
+import mvm.rya.shell.SharedShellState.ConnectionState;
+import mvm.rya.shell.util.ConnectorFactory;
+import mvm.rya.shell.util.PasswordPrompt;
+
+/**
+ * Spring Shell commands that manage the connection that is used by the shell.
+ */
+@Component
+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 DISCONNECT_COMMAND_NAME_CMD = "disconnect";
+
+ private final SharedShellState sharedState;
+ private final PasswordPrompt passwordPrompt;
+
+ /**
+ * Constructs an instance of {@link RyaConnectionCommands}.
+ *
+ * @param state - Holds shared state between all of the command classes. (not null)
+ * @param passwordPrompt - Prompts the user for their password when connecting to a Rya store. (not null)
+ */
+ @Autowired
+ public RyaConnectionCommands(final SharedShellState state, final PasswordPrompt passwordPrompt) {
+ this.sharedState = requireNonNull( state );
+ this.passwordPrompt = requireNonNull(passwordPrompt);
+ }
+
+ @CliAvailabilityIndicator({PRINT_CONNECTION_DETAILS_CMD})
+ public boolean isPrintConnectionDetailsAvailable() {
+ return true;
+ }
+
+ @CliAvailabilityIndicator({CONNECT_ACCUMULO_CMD})
+ public boolean areConnectCommandsAvailable() {
+ return sharedState.getShellState().getConnectionState() == ConnectionState.DISCONNECTED;
+ }
+
+ @CliAvailabilityIndicator({CONNECT_INSTANCE_CMD})
+ public boolean isConnectToInstanceAvailable() {
+ switch(sharedState.getShellState().getConnectionState()) {
+ case CONNECTED_TO_STORAGE:
+ case CONNECTED_TO_INSTANCE:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ @CliAvailabilityIndicator({DISCONNECT_COMMAND_NAME_CMD})
+ public boolean isDisconnectAvailable() {
+ return sharedState.getShellState().getConnectionState() != ConnectionState.DISCONNECTED;
+ }
+
+ @CliCommand(value = PRINT_CONNECTION_DETAILS_CMD, help = "Print information about the Shell's Rya storage connection.")
+ public String printConnectionDetails() {
+ final Optional<AccumuloConnectionDetails> detailsHolder = sharedState.getShellState().getConnectionDetails();
+
+ if(detailsHolder.isPresent()) {
+ final AccumuloConnectionDetails details = detailsHolder.get();
+ return "The shell is connected to an instance of Accumulo using the following parameters:\n" +
+ " Username: " + details.getUsername() + "\n" +
+ " Instance Name: " + details.getInstanceName() + "\n" +
+ " Zookeepers: " + details.getZookeepers();
+ } else {
+ return "The shell is not connected to anything.";
+ }
+ }
+
+ @CliCommand(value = CONNECT_ACCUMULO_CMD, help = "Connect the shell to an instance of Accumulo.")
+ public String connectToAccumulo(
+ @CliOption(key = {"username"}, mandatory = true, help = "The username that will be used to connect to Accummulo.")
+ final String username,
+ @CliOption(key = {"instanceName"}, mandatory = true, help = "The name of the Accumulo instance that will be connected to.")
+ final String instanceName,
+ @CliOption(key = {"zookeepers"}, mandatory = true, help = "A comma delimited list of zookeeper server hostnames.")
+ final String zookeepers
+ ) {
+
+ try {
+ // Prompt the user for their password.
+ final char[] password = passwordPrompt.getPassword();
+ final Connector connector= new ConnectorFactory().connect(username, CharBuffer.wrap(password), instanceName, zookeepers);
+
+ // Initialize the connected to Accumulo shared state.
+ final AccumuloConnectionDetails accumuloDetails = new AccumuloConnectionDetails(username, password, instanceName, zookeepers);
+ final RyaClient commands = AccumuloRyaClientFactory.build(accumuloDetails, connector);
+ sharedState.connectedToAccumulo(accumuloDetails, commands);
+
+ } catch(IOException | AccumuloException | AccumuloSecurityException e) {
+ throw new RuntimeException("Could not connect to Accumulo. Reason: " + e.getMessage(), e);
+ }
+
+ return "Connected. You must select a Rya instance to interact with next.";
+ }
+
+ @CliCommand(value = CONNECT_INSTANCE_CMD, help = "Connect to a specific ")
+ public void connectToInstance(
+ @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();
+
+ // TODO gracefully fail if that version doen't support it. maybe the list command should go ahead
+
+ // Make sure the requested instance exists.
+ if(!instanceExists.exists(instance)) {
+ throw new RuntimeException(String.format("'%s' does not match an existing Rya instance.", instance));
+ }
+ } catch(final RyaClientException e) {
+ throw new RuntimeException("Could not connect to Rya instance. Reason: " + e.getMessage(), e);
+ }
+
+ // Store the instance name in the shared state.
+ sharedState.connectedToInstance(instance);
+ }
+
+ @CliCommand(value = DISCONNECT_COMMAND_NAME_CMD, help = "Disconnect the shell from the Rya storage it is connect to.")
+ public void disconnect() {
+ sharedState.disconnected();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/shell/RyaPromptProvider.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/shell/RyaPromptProvider.java b/extras/rya.console/src/main/java/mvm/rya/shell/RyaPromptProvider.java
new file mode 100644
index 0000000..b78fdd9
--- /dev/null
+++ b/extras/rya.console/src/main/java/mvm/rya/shell/RyaPromptProvider.java
@@ -0,0 +1,62 @@
+/**
+ * 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 mvm.rya.shell;
+
+import static java.util.Objects.requireNonNull;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.shell.plugin.support.DefaultPromptProvider;
+import org.springframework.stereotype.Component;
+
+import mvm.rya.shell.SharedShellState.ShellState;
+
+/**
+ * Customizes the Rya Shell's prompt.
+ */
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class RyaPromptProvider extends DefaultPromptProvider {
+
+ private final SharedShellState sharedState;
+
+ @Autowired
+ public RyaPromptProvider(final SharedShellState sharedState) {
+ this.sharedState = requireNonNull(sharedState);
+ }
+
+ @Override
+ public String getPrompt() {
+ final ShellState state = sharedState.getShellState();
+
+ switch(state.getConnectionState()) {
+ case DISCONNECTED:
+ return "rya> ";
+ case CONNECTED_TO_STORAGE:
+ return String.format("rya/%s> ", state.getConnectionDetails().get().getInstanceName());
+ case CONNECTED_TO_INSTANCE:
+ return String.format("rya/%s:%s> ",
+ state.getConnectionDetails().get().getInstanceName(),
+ state.getRyaInstanceName().get());
+ default:
+ return "rya> ";
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/shell/SharedShellState.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/shell/SharedShellState.java b/extras/rya.console/src/main/java/mvm/rya/shell/SharedShellState.java
new file mode 100644
index 0000000..01ab8bf
--- /dev/null
+++ b/extras/rya.console/src/main/java/mvm/rya/shell/SharedShellState.java
@@ -0,0 +1,338 @@
+/**
+ * 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 mvm.rya.shell;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Objects;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+import javax.annotation.concurrent.Immutable;
+import javax.annotation.concurrent.ThreadSafe;
+
+import com.google.common.base.Optional;
+
+import mvm.rya.api.client.RyaClient;
+import mvm.rya.api.client.accumulo.AccumuloConnectionDetails;
+
+/**
+ * Holds values that are shared between the various Rya command classes.
+ */
+@ThreadSafe
+@ParametersAreNonnullByDefault
+public class SharedShellState {
+ // The shared nature of this object means we shouldn't assume only a single thread is accessing it.
+ private final ReentrantLock lock = new ReentrantLock();
+
+ // The current state.
+ private ShellState shellState = ShellState.builder()
+ .setConnectionState( ConnectionState.DISCONNECTED )
+ .build();
+
+ /**
+ * @return The values that define the state of the Rya Shell.
+ */
+ public ShellState getShellState() {
+ lock.lock();
+ try {
+ return shellState;
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /**
+ * This method indicates a shift into the {@link ConnectionState#CONNECTED_TO_STORAGE} state.
+ * <p/>
+ * Store the values used by an Accumulo Rya Storage connection. This may
+ * only be called when the shell is disconnected.
+ *
+ * @param connectionDetails - Metadata about the Accumulo connection. (not null)
+ * @param connectedCommands - Rya Commands that will execute against the Accumulo instance. (not null)
+ * @throws IllegalStateException Thrown if the shell is already connected to a Rya storage.
+ */
+ public void connectedToAccumulo(
+ final AccumuloConnectionDetails connectionDetails,
+ final RyaClient connectedCommands) throws IllegalStateException {
+ requireNonNull(connectionDetails);
+ requireNonNull(connectedCommands);
+
+ lock.lock();
+ try {
+ // Ensure the Rya Shell is disconnected.
+ if(shellState.getConnectionState() != ConnectionState.DISCONNECTED) {
+ throw new IllegalStateException("You must clear the old connection state before you may set a new connection state.");
+ }
+
+ // Store the connection details.
+ shellState = ShellState.builder()
+ .setConnectionState( ConnectionState.CONNECTED_TO_STORAGE )
+ .setAccumuloConnectionDetails( connectionDetails )
+ .setConnectedCommands( connectedCommands )
+ .build();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /**
+ * This method indicates a shift into the {@link ConnectionState#CONNECTED_TO_INSTANCE} state.
+ * <p/>
+ * Store the name of the Rya instance all commands will be executed against.
+ *
+ * @param instanceName - The name of the Rya instance. (not null)
+ * @throws IllegalStateException Thrown if the shell is disconnected.
+ */
+ public void connectedToInstance(final String instanceName) throws IllegalStateException {
+ requireNonNull(instanceName);
+
+ lock.lock();
+ try {
+ // Verify the Rya Shell is connected to a storage.
+ if(shellState.getConnectionState() == ConnectionState.DISCONNECTED) {
+ throw new IllegalStateException("You can not set a Rya Instance Name before connecting to a Rya Storage.");
+ }
+
+ // Set the instance name.
+ shellState = ShellState.builder( shellState )
+ .setConnectionState(ConnectionState.CONNECTED_TO_INSTANCE)
+ .setRyaInstanceName( instanceName )
+ .build();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /**
+ * This method indicates a shift into the {@link DISCONNECTED} state.
+ * <p/>
+ * Clears all of the values associated with a Rya Storage/Instance connection.
+ * If the shell is already disconnected, then this method does not do anything.
+ */
+ public void disconnected() {
+ lock.lock();
+ try {
+ shellState = ShellState.builder()
+ .setConnectionState(ConnectionState.DISCONNECTED)
+ .build();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /**
+ * Enumerates the various states a Rya Shell may be in.
+ */
+ public static enum ConnectionState {
+ /**
+ * The shell is not connected to a Rya Storage.
+ */
+ DISCONNECTED,
+
+ /**
+ * The shell is connected to a Rya Storage, but a specific instance hasn't been set.
+ */
+ CONNECTED_TO_STORAGE,
+
+ /**
+ * The shell is connected to Rya Storage and a specific Rya Instance.
+ */
+ CONNECTED_TO_INSTANCE;
+ }
+
+ /**
+ * Values that define the state of a Rya Shell.
+ */
+ @Immutable
+ @ParametersAreNonnullByDefault
+ public static final class ShellState {
+ // Indicates the state of the shell.
+ private final ConnectionState connectionState;
+
+ // Connection specific values.
+ private final Optional<AccumuloConnectionDetails> connectionDetails;
+ private final Optional<RyaClient> connectedCommands;
+
+ // Instance specific values.
+ private final Optional<String> instanceName;
+
+ private ShellState(
+ final ConnectionState connectionState,
+ final Optional<AccumuloConnectionDetails> connectionDetails,
+ final Optional<RyaClient> connectedCommands,
+ final Optional<String> instanceName) {
+ this.connectionState = requireNonNull(connectionState);
+ this.connectionDetails = requireNonNull(connectionDetails);
+ this.connectedCommands = requireNonNull(connectedCommands);
+ this.instanceName = requireNonNull(instanceName);
+ }
+
+ /**
+ * @return The {@link ConnectionState} of the Rya Shell.
+ */
+ public ConnectionState getConnectionState() {
+ return connectionState;
+ }
+
+ /**
+ * @return Metadata about the Accumulo connection. The value will not be present
+ * if the Rya Shell is not connected to a storage.
+ */
+ public Optional<AccumuloConnectionDetails> getConnectionDetails() {
+ return connectionDetails;
+ }
+
+ /**
+ * @return The {@link RyaClient} to use when a command on the shell is issued.
+ * The value will not be present if the Rya Shell is not connected to a storage.
+ */
+ public Optional<RyaClient> getConnectedCommands() {
+ return connectedCommands;
+ }
+
+ /**
+ * @return The name of the Rya Instance the Rya Shell is issuing commands to.
+ * The value will not be present if the Rya Shell is not connected to a
+ * storage or if a target instance has not been set yet.
+ */
+ public Optional<String> getRyaInstanceName() {
+ return instanceName;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(connectionState, connectionDetails, connectedCommands, instanceName);
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if(this == obj) {
+ return true;
+ }
+ if(obj instanceof ShellState) {
+ final ShellState state = (ShellState)obj;
+ return Objects.equals(connectionState, state.connectionState) &&
+ Objects.equals(connectionDetails, state.connectionDetails) &&
+ Objects.equals(connectedCommands, state.connectedCommands) &&
+ Objects.equals(instanceName, state.instanceName);
+ }
+ return false;
+ }
+
+ /**
+ * @return An empty instance of {@link Builder}.
+ */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * Create an instance of {@link Builder} populated with the values of {code shellState}.
+ *
+ * @param shellState - The initial state of the Builder.
+ * @return An instance of {@link Builder} populated with the values
+ * of {code shellState}.
+ */
+ public static Builder builder(final ShellState shellState) {
+ return new Builder(shellState);
+ }
+
+ /**
+ * Builds instances of {@link ShellState}.
+ */
+ @ParametersAreNonnullByDefault
+ public static class Builder {
+ private ConnectionState connectionState;
+
+ // Connection specific values.
+ private AccumuloConnectionDetails connectionDetails;
+ private RyaClient connectedCommands;
+
+ // Instance specific values.
+ private String instanceName;
+
+ /**
+ * Constructs an empty instance of {@link Builder}.
+ */
+ public Builder() { }
+
+ /**
+ * Constructs an instance of {@builder} initialized with the values
+ * of a {@link ShellState}.
+ *
+ * @param shellState - The initial state of the builder. (not null)
+ */
+ public Builder(final ShellState shellState) {
+ this.connectionState = shellState.getConnectionState();
+ this.connectionDetails = shellState.getConnectionDetails().orNull();
+ this.connectedCommands = shellState.getConnectedCommands().orNull();
+ this.instanceName = shellState.getRyaInstanceName().orNull();
+ }
+
+ /**
+ * @param connectionState - The {@link ConnectionState} of the Rya Shell.
+ * @return This {@link Builder} so that method invocations may be chained.
+ */
+ public Builder setConnectionState(@Nullable final ConnectionState connectionState) {
+ this.connectionState = connectionState;
+ return this;
+ }
+
+ /**
+ * @param connectionDetails - Metadata about the Accumulo connection.
+ * @return This {@link Builder} so that method invocations may be chained.
+ */
+ public Builder setAccumuloConnectionDetails(@Nullable final AccumuloConnectionDetails connectionDetails) {
+ this.connectionDetails = connectionDetails;
+ return this;
+ }
+
+ /**
+ * @param connectedCommands - The {@link RyaClient} to use when a command on the shell is issued.
+ * @return This {@link Builder} so that method invocations may be chained.
+ */
+ public Builder setConnectedCommands(@Nullable final RyaClient connectedCommands) {
+ this.connectedCommands = connectedCommands;
+ return this;
+ }
+
+ /**
+ * @param instanceName - The name of the Rya Instance the Rya Shell is issuing commands to.
+ * @return This {@link Builder} so that method invocations may be chained.
+ */
+ public Builder setRyaInstanceName(@Nullable final String instanceName) {
+ this.instanceName = instanceName;
+ return this;
+ }
+
+ /**
+ * @return An instance of {@link ShellState} built using this builder's values.
+ */
+ public ShellState build() {
+ return new ShellState(
+ connectionState,
+ Optional.fromNullable(connectionDetails),
+ Optional.fromNullable(connectedCommands),
+ Optional.fromNullable(instanceName));
+ }
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/shell/util/ConnectorFactory.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/shell/util/ConnectorFactory.java b/extras/rya.console/src/main/java/mvm/rya/shell/util/ConnectorFactory.java
new file mode 100644
index 0000000..23c3e26
--- /dev/null
+++ b/extras/rya.console/src/main/java/mvm/rya/shell/util/ConnectorFactory.java
@@ -0,0 +1,66 @@
+/**
+ * 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 mvm.rya.shell.util;
+
+import static java.util.Objects.requireNonNull;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.Instance;
+import org.apache.accumulo.core.client.ZooKeeperInstance;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+
+/**
+ * Creates {@link Connector}s that are linked to an instance of Accumulo.
+ */
+@ParametersAreNonnullByDefault
+public class ConnectorFactory {
+
+ /**
+ * Create a {@link Connector} that uses the provided connection details.
+ *
+ * @param username - The username the connection will use. (not null)
+ * @param password - The password the connection will use. (not null)
+ * @param instanceName - The name of the Accumulo instance. (not null)
+ * @param zookeeperHostnames - A comma delimited list of the Zookeeper server hostnames. (not null)
+ * @return A {@link Connector} that may be used to access the instance of Accumulo.
+ * @throws AccumuloSecurityException Could not connect for security reasons.
+ * @throws AccumuloException Could not connect for other reasons.
+ */
+ public Connector connect(
+ final String username,
+ final CharSequence password,
+ final String instanceName,
+ final String zookeeperHostnames) throws AccumuloException, AccumuloSecurityException {
+ requireNonNull(username);
+ requireNonNull(password);
+ requireNonNull(instanceName);
+ requireNonNull(zookeeperHostnames);
+
+ // Setup the password token that will be used.
+ final PasswordToken token = new PasswordToken( password );
+
+ // Connect to the instance of Accumulo.
+ final Instance instance = new ZooKeeperInstance(instanceName, zookeeperHostnames);
+ return instance.getConnector(username, token);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/shell/util/InstallPrompt.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/shell/util/InstallPrompt.java b/extras/rya.console/src/main/java/mvm/rya/shell/util/InstallPrompt.java
new file mode 100644
index 0000000..c4a81d2
--- /dev/null
+++ b/extras/rya.console/src/main/java/mvm/rya/shell/util/InstallPrompt.java
@@ -0,0 +1,131 @@
+/**
+ * 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 mvm.rya.shell.util;
+
+import java.io.IOException;
+
+import com.google.common.base.Optional;
+
+import jline.console.ConsoleReader;
+import mvm.rya.api.client.Install.InstallConfiguration;
+
+/**
+ * A mechanism for prompting a user of the application for a the parameters
+ * that will be used when installing an instance of Rya.
+ */
+public interface InstallPrompt {
+
+ /**
+ * Prompt the user for the name of the Rya instance that will be created.
+ *
+ * @return The value they entered.
+ * @throws IOException There was a problem reading the value.
+ */
+ public String promptInstanceName() throws IOException;
+
+ /**
+ * Prompt the user for which features of Rya they want enabled.
+ *
+ * @return The value they entered.
+ * @throws IOException There was a problem reading the values.
+ */
+ public InstallConfiguration promptInstallConfiguration() throws IOException;
+
+ /**
+ * Prompt the user asking them if they are sure they would like to do the
+ * install.
+ *
+ * @return The value they entered.
+ * @throws IOException There was a problem reading the value.
+ */
+ public boolean promptVerified(String instanceName, InstallConfiguration installConfig) throws IOException;
+
+ /**
+ * Prompts a user for install information using a JLine {@link ConsoleReader}.
+ */
+ public static class JLineAccumuloInstallPrompt extends JLinePrompt implements InstallPrompt {
+
+ @Override
+ public String promptInstanceName() throws IOException {
+ final ConsoleReader reader = getReader();
+ reader.setPrompt("Rya Instance Name: ");
+ final String instanceName = reader.readLine();
+ return instanceName;
+ }
+
+ @Override
+ public InstallConfiguration promptInstallConfiguration() throws IOException {
+ final InstallConfiguration.Builder builder = InstallConfiguration.builder();
+
+ String prompt = makeFieldPrompt("Use Shard Balancing (improves streamed input write speeds)", false);
+ final boolean enableTableHashPrefix = promptBoolean(prompt, Optional.of(false));
+ builder.setEnableTableHashPrefix( enableTableHashPrefix );
+
+ prompt = makeFieldPrompt("Use Entity Centric Indexing", true);
+ final boolean enableEntityCentricIndexing = promptBoolean(prompt, Optional.of(true));
+ builder.setEnableEntityCentricIndex( enableEntityCentricIndexing );
+
+ prompt = makeFieldPrompt("Use Free Text Indexing", true);
+ final boolean enableFreeTextIndexing = promptBoolean(prompt, Optional.of(true));
+ builder.setEnableFreeTextIndex( enableFreeTextIndexing );
+
+ prompt = makeFieldPrompt("Use Geospatial Indexing", true);
+ final boolean enableGeoIndexing = promptBoolean(prompt, Optional.of(true));
+ builder.setEnableGeoIndex( enableGeoIndexing );
+
+ prompt = makeFieldPrompt("Use Precomputed Join Indexing", true);
+ final boolean enablePCJIndexing = promptBoolean(prompt, Optional.of(true));
+ builder.setEnablePcjIndex( enablePCJIndexing );
+
+ if(enablePCJIndexing) {
+ prompt = "PCJ Updater Fluo Application Name: ";
+ final String fluoAppName = promptString(prompt, Optional.<String>absent());
+ builder.setFluoPcjAppName(fluoAppName);
+ }
+
+ prompt = makeFieldPrompt("Use Temporal Indexing", true);
+ final boolean useTemporalIndexing = promptBoolean(prompt, Optional.of(true));
+ builder.setEnableTemporalIndex( useTemporalIndexing );
+
+ return builder.build();
+ }
+
+ @Override
+ public boolean promptVerified(final String instanceName, final InstallConfiguration installConfig) throws IOException {
+ final ConsoleReader reader = getReader();
+ reader.println();
+ reader.println("A Rya instance will be installed using the following values:");
+ reader.println(" Instance Name: " + instanceName);
+ reader.println(" Use Shard Balancing: " + installConfig.isTableHashPrefixEnabled());
+ 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 Precomputed Join Indexing: " + installConfig.isPcjIndexEnabled());
+ if(installConfig.isPcjIndexEnabled()) {
+ reader.println(" PCJ Updater Fluo Application Name: " + installConfig.getFluoPcjAppName().get());
+ }
+
+ reader.println(" Use Temporal Indexing: " + installConfig.isTemporalIndexEnabled());
+ reader.println("");
+
+ return promptBoolean("Continue with the install? ", Optional.<Boolean>absent());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/fcc98bd9/extras/rya.console/src/main/java/mvm/rya/shell/util/InstanceNamesFormatter.java
----------------------------------------------------------------------
diff --git a/extras/rya.console/src/main/java/mvm/rya/shell/util/InstanceNamesFormatter.java b/extras/rya.console/src/main/java/mvm/rya/shell/util/InstanceNamesFormatter.java
new file mode 100644
index 0000000..dc70894
--- /dev/null
+++ b/extras/rya.console/src/main/java/mvm/rya/shell/util/InstanceNamesFormatter.java
@@ -0,0 +1,77 @@
+/**
+ * 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 mvm.rya.shell.util;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+/**
+ * Pretty formats a list of Rya instance names.
+ */
+@ParametersAreNonnullByDefault
+public class InstanceNamesFormatter {
+
+ /**
+ * Formats the list of Rya instance names with a '*' next to whichever entry
+ * matches the connected name.
+ *
+ * @param names - The Rya instance names. (not null)
+ * @param connectedName - The instance name that will have a '*' next to it. (not null)
+ * @return A string holding the pretty formatted list.
+ */
+ public String format(final List<String> names, final String connectedName) {
+ requireNonNull(names);
+ requireNonNull(connectedName);
+
+ // Will be -1 if the connected name isn't in the list of names, so none will be starred.
+ final int connectedIndex = names.indexOf( connectedName );
+
+ final StringBuilder formatted = new StringBuilder("Rya instance names:\n");
+ for(int i = 0; i < names.size(); i++) {
+ if(i == connectedIndex) {
+ formatted.append(" * ");
+ } else {
+ formatted.append(" ");
+ }
+ formatted.append( names.get(i) ).append("\n");
+ }
+
+ return formatted.toString();
+ }
+
+ /**
+ * Formats the list of Rya instance names.
+ *
+ * @param names - The Rya instance names. (not null)
+ * @return A string holding the pretty formatted list.
+ */
+ public String format(final List<String> names) {
+ requireNonNull(names);
+
+ final StringBuilder formatted = new StringBuilder("Rya instance names:\n");
+ for(int i = 0; i < names.size(); i++) {
+ formatted.append(" ").append( names.get(i) ).append("\n");
+ }
+
+ return formatted.toString();
+ }
+}
\ No newline at end of file