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 <[email protected]> Authored: Thu Jul 27 11:00:52 2017 -0400 Committer: Caleb Meier <[email protected]> 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
