You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by ca...@apache.org on 2018/01/06 00:39:06 UTC
[04/15] incubator-rya git commit: RYA-104 most interactors complete.
RYA-104 most interactors complete.
Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/33a04863
Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/33a04863
Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/33a04863
Branch: refs/heads/master
Commit: 33a04863581e5a875b2ec9bd23a488b3595640db
Parents: 7b571d4
Author: David W. Lotts <da...@parsons.com>
Authored: Wed Dec 13 17:34:55 2017 -0500
Committer: kchilton2 <ke...@gmail.com>
Committed: Fri Jan 5 16:48:40 2018 -0500
----------------------------------------------------------------------
.../org/apache/rya/api/client/RyaClient.java | 12 +-
.../mongodb/instance/MongoDetailsAdapter.java | 26 +--
.../MongoRyaInstanceDetailsRepository.java | 12 +-
.../rya/api/client/mongo/MongoCommand.java | 65 ++++++
.../client/mongo/MongoConnectionDetails.java | 93 +++++++++
.../rya/api/client/mongo/MongoCreatePCJ.java | 58 ++++++
.../rya/api/client/mongo/MongoDeletePCJ.java | 51 +++++
.../client/mongo/MongoGetInstanceDetails.java | 80 ++++++++
.../rya/api/client/mongo/MongoInstall.java | 199 +++++++++++++++++++
.../api/client/mongo/MongoInstanceExists.java | 53 +++++
.../api/client/mongo/MongoListInstances.java | 68 +++++++
.../api/client/mongo/MongoLoadStatements.java | 29 +++
.../client/mongo/MongoLoadStatementsFile.java | 87 ++++++++
.../api/client/mongo/MongoRyaClientFactory.java | 66 ++++++
.../rya/api/client/mongo/MongoUninstall.java | 61 ++++++
.../client/mongo/MongoGetInstanceDetailsIT.java | 123 ++++++++++++
.../rya/api/client/mongo/MongoInstallIT.java | 105 ++++++++++
.../api/client/mongo/MongoInstanceExistsIT.java | 86 ++++++++
.../api/client/mongo/MongoListInstancesIT.java | 71 +++++++
.../client/mongo/MongoLoadStatementsFileIT.java | 132 ++++++++++++
.../rya/api/client/mongo/MongoUninstallIT.java | 78 ++++++++
21 files changed, 1531 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/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 1278193..0a55edb 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
@@ -74,16 +74,16 @@ public class RyaClient {
this.createPeriodicPcj = createPeriodicPcj;
this.deletePeriodicPcj = deletePeriodicPcj;
this.listIncrementalQueries = listIncrementalQueries;
- this.bactchUpdatePCJ = requireNonNull(batchUpdatePcj);
+ this.bactchUpdatePCJ = batchUpdatePcj;
this.getInstanceDetails = requireNonNull(getInstanceDetails);
this.instanceExists = requireNonNull(instanceExists);
this.listInstances = requireNonNull(listInstances);
- this.addUser = requireNonNull(addUser);
- this.removeUser = requireNonNull(removeUser);
+ this.addUser = addUser;
+ this.removeUser = removeUser;
this.uninstall = requireNonNull(uninstall);
- this.loadStatements = requireNonNull(loadStatements);
- this.loadStatementsFile = requireNonNull(loadStatementsFile);
- this.executeSparqlQuery = requireNonNull(executeSparqlQuery);
+ this.loadStatements = loadStatements; // FIXME requireNonNull(loadStatements);
+ this.loadStatementsFile = loadStatementsFile; // FIXME requireNonNull(loadStatementsFile);
+ this.executeSparqlQuery = executeSparqlQuery; // FIXME requireNonNull(executeSparqlQuery);
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoDetailsAdapter.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoDetailsAdapter.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoDetailsAdapter.java
index d11af76..3b77a88 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoDetailsAdapter.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoDetailsAdapter.java
@@ -24,9 +24,6 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
import org.apache.rya.api.instance.RyaDetails;
import org.apache.rya.api.instance.RyaDetails.EntityCentricIndexDetails;
import org.apache.rya.api.instance.RyaDetails.FreeTextIndexDetails;
@@ -45,6 +42,9 @@ import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBObject;
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
/**
* Serializes configuration details for use in Mongo.
* The {@link DBObject} will look like:
@@ -182,15 +182,17 @@ public class MongoDetailsAdapter {
private static PCJIndexDetails.Builder getPCJIndexDetails(final BasicDBObject basicObj) {
final BasicDBObject pcjIndexDBO = (BasicDBObject) basicObj.get(PCJ_DETAILS_KEY);
- final PCJIndexDetails.Builder pcjBuilder = PCJIndexDetails.builder()
- .setEnabled(pcjIndexDBO.getBoolean(PCJ_ENABLED_KEY))
- .setFluoDetails(new FluoDetails(pcjIndexDBO.getString(PCJ_FLUO_KEY)));
-
- final BasicDBList pcjs = (BasicDBList) pcjIndexDBO.get(PCJ_PCJS_KEY);
- if(pcjs != null) {
- for(int ii = 0; ii < pcjs.size(); ii++) {
- final BasicDBObject pcj = (BasicDBObject) pcjs.get(ii);
- pcjBuilder.addPCJDetails( toPCJDetails(pcj) );
+ final PCJIndexDetails.Builder pcjBuilder = PCJIndexDetails.builder();
+ if (!pcjIndexDBO.getBoolean(PCJ_ENABLED_KEY)) {
+ pcjBuilder.setEnabled(false);
+ } else {
+ pcjBuilder.setEnabled(true).setFluoDetails(new FluoDetails(pcjIndexDBO.getString(PCJ_FLUO_KEY)));
+ final BasicDBList pcjs = (BasicDBList) pcjIndexDBO.get(PCJ_PCJS_KEY);
+ if (pcjs != null) {
+ for (int ii = 0; ii < pcjs.size(); ii++) {
+ final BasicDBObject pcj = (BasicDBObject) pcjs.get(ii);
+ pcjBuilder.addPCJDetails(toPCJDetails(pcj));
+ }
}
}
return pcjBuilder;
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoRyaInstanceDetailsRepository.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoRyaInstanceDetailsRepository.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoRyaInstanceDetailsRepository.java
index 4a961be..9bb558e 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoRyaInstanceDetailsRepository.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/instance/MongoRyaInstanceDetailsRepository.java
@@ -22,8 +22,9 @@ package org.apache.rya.mongodb.instance;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.util.Objects.requireNonNull;
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
+import org.apache.rya.api.instance.RyaDetails;
+import org.apache.rya.api.instance.RyaDetailsRepository;
+import org.apache.rya.mongodb.instance.MongoDetailsAdapter.MalformedRyaDetailsException;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
@@ -32,9 +33,8 @@ import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteResult;
-import org.apache.rya.api.instance.RyaDetails;
-import org.apache.rya.api.instance.RyaDetailsRepository;
-import org.apache.rya.mongodb.instance.MongoDetailsAdapter.MalformedRyaDetailsException;
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
/**
* An implementation of {@link RyaDetailsRepository} that stores a Rya
@@ -42,7 +42,7 @@ import org.apache.rya.mongodb.instance.MongoDetailsAdapter.MalformedRyaDetailsEx
*/
@DefaultAnnotation(NonNull.class)
public class MongoRyaInstanceDetailsRepository implements RyaDetailsRepository {
- private static final String INSTANCE_DETAILS_COLLECTION_NAME = "instance_details";
+ public static final String INSTANCE_DETAILS_COLLECTION_NAME = "instance_details";
private final DB db;
private final String instanceName;
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoCommand.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoCommand.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoCommand.java
new file mode 100644
index 0000000..24bae95
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoCommand.java
@@ -0,0 +1,65 @@
+/**
+ * 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.mongo;
+
+import static java.util.Objects.requireNonNull;
+
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An abstract class that holds onto Mongo access information. Extend this
+ * when implementing a command that interacts with Mongo.
+ */
+@DefaultAnnotation(NonNull.class)
+public abstract class MongoCommand {
+
+ private final MongoConnectionDetails connectionDetails;
+ private final MongoClient client;
+
+ /**
+ * Constructs an instance of {@link MongoCommand}.
+ *
+ * Details about the values that were used to create the client. (not null)
+ *
+ * @param client
+ * - Provides programatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoCommand(final MongoConnectionDetails connectionDetails, final MongoClient client) {
+ this.connectionDetails = requireNonNull(connectionDetails);
+ this.client = requireNonNull(client);
+ }
+
+ /**
+ * @return Details about the values that were used to create the connector to mongo. (not null)
+ */
+ public MongoConnectionDetails getMongoConnectionDetails() {
+ return connectionDetails;
+ }
+
+ /**
+ * @return Provides programatic access to the instance of Mongo that hosts Rya instance.
+ */
+ public MongoClient getClient() {
+ return client;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoConnectionDetails.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoConnectionDetails.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoConnectionDetails.java
new file mode 100644
index 0000000..16e0453
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoConnectionDetails.java
@@ -0,0 +1,93 @@
+/**
+ * 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.mongo;
+
+import static java.util.Objects.requireNonNull;
+
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.mongodb.MongoDBRdfConfiguration;
+public class MongoConnectionDetails {
+ private String username;
+ private char[] userPass;
+ private String instance;
+ private String host;
+ private String collectionName;
+
+ public MongoConnectionDetails(String username, char[] userPass, String instance, String host, String ryaInstance) {
+ this.username = username;
+ this.userPass = userPass.clone();
+ this.instance = instance;
+ this.host = host;
+ this.collectionName = requireNonNull(ryaInstance);
+ }
+
+ /**
+ * @return the username
+ */
+ public String getUsername() {
+ return this.username;
+ }
+
+ /**
+ * @return the password
+ */
+ public char[] getPassword() {
+ return this.userPass;
+ }
+
+ /**
+ * @return the instance
+ */
+ public String getInstance() {
+ return instance;
+ }
+
+ /**
+ * @return the host AKA MongoInstance
+ */
+ public String getHost() {
+ return host;
+ }
+ /**
+ * @return The Collection/Rya Prefix/Rya instance that was used to establish the connection.
+ */
+ public String getCollectionName() {
+ return collectionName;
+ }
+
+ /**
+ *
+ * @param ryaInstanceName
+ * - The Rya instance to connect to.
+ * @return Constructs a new {@link AccumuloRdfConfiguration} object with values from this object.
+ */
+ public MongoDBRdfConfiguration build(final String ryaInstanceName) {
+
+ // Note, we don't use the MongoDBRdfConfigurationBuilder 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 MongoRdfConfiguration object, it may do the right thing.
+ final MongoDBRdfConfiguration conf = new MongoDBRdfConfiguration();
+ conf.setMongoInstance(host);
+ conf.setCollectionName(ryaInstanceName);
+ conf.setMongoUser(username);
+ conf.setMongoPassword(new String(userPass));
+ return conf;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoCreatePCJ.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoCreatePCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoCreatePCJ.java
new file mode 100644
index 0000000..30d0f14
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoCreatePCJ.java
@@ -0,0 +1,58 @@
+/**
+ * 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.mongo;
+
+import java.util.Set;
+
+import org.apache.rya.api.client.CreatePCJ;
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+import org.apache.rya.api.client.RyaClientException;
+
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link CreatePCJ} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoCreatePCJ extends MongoCommand implements CreatePCJ {
+
+ /**
+ * Constructs an instance of {@link MongoCreatePCJ}.
+ *
+ * @param connectionDetails - Details about the values that were used to create the connector to the cluster. (not null)
+ * @param client - Provides programatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoCreatePCJ(final MongoConnectionDetails connectionDetails, final MongoClient client) {
+ super(connectionDetails, client);
+ }
+
+ @Override
+ public String createPCJ(final String instanceName, final String sparql) throws InstanceDoesNotExistException {
+ throw new UnsupportedOperationException("Mongo does not support PCJ indexing.");
+ }
+
+ @Override
+ public String createPCJ(String instanceName, String sparql, Set<ExportStrategy> strategies) throws InstanceDoesNotExistException, RyaClientException {
+ throw new UnsupportedOperationException("Mongo does not support PCJ indexing.");
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoDeletePCJ.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoDeletePCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoDeletePCJ.java
new file mode 100644
index 0000000..6e16bf0
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoDeletePCJ.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.api.client.mongo;
+
+import org.apache.rya.api.client.DeletePCJ;
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+import org.apache.rya.api.client.RyaClientException;
+
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link DeletePCJ} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoDeletePCJ extends MongoCommand implements DeletePCJ {
+
+ /**
+ * Constructs an instance of {@link MongoDeletePCJ}.
+ *
+ * @param connectionDetails Details about the values that were used to create the connector to the cluster. (not null)
+ * @param client Provides programatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoDeletePCJ(final MongoConnectionDetails connectionDetails, final MongoClient client) {
+ super(connectionDetails, client);
+ }
+
+ @Override
+ public void deletePCJ(final String instanceName, final String pcjId) throws InstanceDoesNotExistException, RyaClientException {
+ throw new UnsupportedOperationException("Mongo does not support PCJ Indexing.");
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetails.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetails.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetails.java
new file mode 100644
index 0000000..1bfa97a
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetails.java
@@ -0,0 +1,80 @@
+/**
+ * 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.mongo;
+
+import static java.util.Objects.requireNonNull;
+
+import org.apache.rya.api.client.GetInstanceDetails;
+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.instance.RyaDetails;
+import org.apache.rya.api.instance.RyaDetailsRepository;
+import org.apache.rya.api.instance.RyaDetailsRepository.NotInitializedException;
+import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
+import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
+
+import com.google.common.base.Optional;
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link GetInstanceDetails} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoGetInstanceDetails extends MongoCommand implements GetInstanceDetails {
+
+ private final InstanceExists instanceExists;
+
+ /**
+ * Constructs an instance of {@link MongoGetInstanceDetails}.
+ *
+ * @param connectionDetails
+ * - Details about the values that were used to create the connector to the cluster. (not null)
+ * @param client
+ * - Provides programatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoGetInstanceDetails(final MongoConnectionDetails connectionDetails, final MongoClient client) {
+ super(connectionDetails, client);
+ instanceExists = new MongoInstanceExists(connectionDetails, client);
+ }
+
+ @Override
+ public Optional<RyaDetails> getDetails(final String ryaInstanceName) throws InstanceDoesNotExistException, RyaClientException {
+ requireNonNull(ryaInstanceName);
+
+ // Ensure the Rya instance exists.
+ if (!instanceExists.exists(ryaInstanceName)) {
+ throw new InstanceDoesNotExistException(String.format("There is no Rya instance named '%s'.", ryaInstanceName));
+ }
+
+ // If the instance has details, then return them.
+ final RyaDetailsRepository detailsRepo = new MongoRyaInstanceDetailsRepository(getClient(), ryaInstanceName);
+ try {
+ return Optional.of(detailsRepo.getRyaInstanceDetails());
+ } catch (final NotInitializedException e) {
+ return Optional.absent();
+ } catch (final RyaDetailsRepositoryException e) {
+ throw new RyaClientException("Could not fetch the Rya instance's details.", e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstall.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstall.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstall.java
new file mode 100644
index 0000000..2766536
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstall.java
@@ -0,0 +1,199 @@
+/**
+ * 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.mongo;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Date;
+
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.client.Install;
+import org.apache.rya.api.client.InstanceExists;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.api.instance.RyaDetails;
+import org.apache.rya.api.instance.RyaDetails.EntityCentricIndexDetails;
+import org.apache.rya.api.instance.RyaDetails.FreeTextIndexDetails;
+import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
+import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
+import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
+import org.apache.rya.api.instance.RyaDetails.TemporalIndexDetails;
+import org.apache.rya.api.instance.RyaDetailsRepository;
+import org.apache.rya.api.instance.RyaDetailsRepository.AlreadyInitializedException;
+import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
+import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
+import org.apache.rya.api.persist.RyaDAOException;
+import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.apache.rya.mongodb.MongoDBRdfConfiguration;
+import org.apache.rya.mongodb.MongoDBRyaDAO;
+import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
+
+import com.google.common.base.Optional;
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link Install} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoInstall extends MongoCommand implements Install {
+
+ private final InstanceExists instanceExists;
+
+ /**
+ * Constructs an instance of {@link MongoInstall}.
+ *
+ * @param connectionDetails
+ * - Details about the values that were used to create the connector to the cluster. (not null)
+ * @param client
+ * - Provides programatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoInstall(final MongoConnectionDetails connectionDetails, final MongoClient client) {
+ super(connectionDetails, client);
+ instanceExists = new MongoInstanceExists(connectionDetails, client);
+ }
+
+ @Override
+ public void install(final String instanceName, final InstallConfiguration installConfig) throws DuplicateInstanceNameException, RyaClientException {
+ requireNonNull(instanceName, "instanceName required.");
+ requireNonNull(installConfig, "installConfig required.");
+
+ // Check to see if a Rya instance has already been installed with this name.
+ if (instanceExists.exists(instanceName)) {
+ throw new DuplicateInstanceNameException("An instance of Rya has already been installed to this Rya storage " + "with the name '" + instanceName + "'. Try again with a different name.");
+ }
+
+ // Initialize the Rya Details table.
+ RyaDetails details;
+ try {
+ details = initializeRyaDetails(instanceName, installConfig);
+ } catch (final AlreadyInitializedException e) {
+ // This can only happen if somebody else installs an instance of Rya with the name between the check and now.
+ throw new DuplicateInstanceNameException("An instance of Rya has already been installed to this Rya storage "//
+ + "with the name '" + instanceName//
+ + "'. Try again with a different name.");
+ } catch (final RyaDetailsRepositoryException e) {
+ throw new RyaClientException("The RyaDetails couldn't be initialized. Details: " + e.getMessage(), e);
+ }
+
+ // Initialize the rest of the tables used by the Rya instance.
+ final MongoDBRdfConfiguration ryaConfig = makeRyaConfig(getMongoConnectionDetails(), details);
+ try {
+ final MongoDBRyaDAO ryaDao = new MongoDBRyaDAO(ryaConfig, getClient());
+ ryaDao.setConf(ryaConfig);
+
+ final TablePrefixLayoutStrategy tls = new TablePrefixLayoutStrategy();
+ tls.setTablePrefix(instanceName);
+ ryaConfig.setTableLayoutStrategy(tls);
+
+ ryaDao.init();
+ } catch (final RyaDAOException e) {
+ throw new RyaClientException("Could not initialize all of the tables for the new Rya instance. " //
+ + "This instance may be left in a bad state.", e);
+ }
+ }
+
+ /**
+ * @return The version of the application as reported by the manifest.
+ */
+ private String getVersion() {
+ return "" + this.getClass().getPackage().getImplementationVersion();
+ }
+
+ /**
+ * Initializes the {@link RyaDetails} and stores them for the new instance.
+ *
+ * @param instanceName
+ * - The name of the instance that is being created. (not null)
+ * @param installConfig
+ * - The instance's install configuration. (not null)
+ * @return The {@link RyaDetails} that were stored.
+ * @throws AlreadyInitializedException
+ * Could not be initialized because
+ * a table with this instance name has already exists and is holding the details.
+ * @throws RyaDetailsRepositoryException
+ * Something caused the initialization
+ * operation to fail.
+ */
+ private RyaDetails initializeRyaDetails(final String instanceName, final InstallConfiguration installConfig) throws AlreadyInitializedException, RyaDetailsRepositoryException {
+ final RyaDetailsRepository detailsRepo = new MongoRyaInstanceDetailsRepository(getClient(), instanceName);
+
+ // Build the PCJ Index details. [not supported in mongo]
+ final PCJIndexDetails.Builder pcjDetailsBuilder = PCJIndexDetails.builder().setEnabled(false);
+
+ final RyaDetails details = RyaDetails.builder()
+ // General Metadata
+ .setRyaInstanceName(instanceName).setRyaVersion(getVersion())
+
+ // Secondary Index Values
+ // FIXME .setGeoIndexDetails(new GeoIndexDetails(installConfig.isGeoIndexEnabled()))
+ .setTemporalIndexDetails(new TemporalIndexDetails(installConfig.isTemporalIndexEnabled())) //
+ .setFreeTextDetails(new FreeTextIndexDetails(installConfig.isFreeTextIndexEnabled()))//
+ .setEntityCentricIndexDetails(new EntityCentricIndexDetails(false))// not supported in mongo
+ .setPCJIndexDetails(pcjDetailsBuilder)
+
+ // Statistics values.
+ .setProspectorDetails(new ProspectorDetails(Optional.<Date> absent()))//
+ .setJoinSelectivityDetails(new JoinSelectivityDetails(Optional.<Date> absent()))//
+ .build();
+
+ // Initialize the table.
+ detailsRepo.initialize(details);
+
+ return details;
+ }
+
+ /**
+ * Builds a {@link MongoRdfConfiguration} object that will be used by the
+ * Rya DAO to initialize all of the tables it will need.
+ *
+ * @param connectionDetails
+ * - Indicates how to connect to Mongo. (not null)
+ * @param details
+ * - Indicates what needs to be installed. (not null)
+ * @return A Rya Configuration object that can be used to perform the install.
+ */
+ private static MongoDBRdfConfiguration makeRyaConfig(final MongoConnectionDetails connectionDetails, final RyaDetails details) {
+ final MongoDBRdfConfiguration conf = new MongoDBRdfConfiguration();
+ conf.setBoolean(ConfigUtils.USE_MONGO, true);
+ // The Rya Instance Name is used as a prefix for the index tables in Mongo.
+ conf.set(RdfCloudTripleStoreConfiguration.CONF_TBL_PREFIX, details.getRyaInstanceName());
+
+ // Enable the indexers that the instance is configured to use.
+ conf.set(ConfigUtils.USE_PCJ, "" + details.getPCJIndexDetails().isEnabled());
+ // fixme conf.set(OptionalConfigUtils.USE_GEO, "" + details.getGeoIndexDetails().isEnabled() );
+ conf.set(ConfigUtils.USE_FREETEXT, "" + details.getFreeTextIndexDetails().isEnabled());
+ conf.set(ConfigUtils.USE_TEMPORAL, "" + details.getTemporalIndexDetails().isEnabled());
+
+ // Mongo does not support entity indexing.
+ conf.set(ConfigUtils.USE_ENTITY, "" + false);
+
+ conf.set(ConfigUtils.CLOUDBASE_USER, connectionDetails.getUsername());
+ conf.set(ConfigUtils.CLOUDBASE_PASSWORD, new String(connectionDetails.getPassword()));
+ conf.set(MongoDBRdfConfiguration.MONGO_DB_NAME, details.getRyaInstanceName());
+
+ // This initializes the living indexers that will be used by the application and
+ // caches them within the configuration object so that they may be used later.
+ ConfigUtils.setIndexers(conf);
+
+ return conf;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstanceExists.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstanceExists.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstanceExists.java
new file mode 100644
index 0000000..2560856
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstanceExists.java
@@ -0,0 +1,53 @@
+/**
+ * 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.mongo;
+
+import static java.util.Objects.requireNonNull;
+
+import org.apache.rya.api.client.InstanceExists;
+import org.apache.rya.api.client.RyaClientException;
+
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link InstanceExists} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoInstanceExists extends MongoCommand implements InstanceExists {
+
+ /**
+ * Constructs an insatnce of {@link MongoInstanceExists}.
+ *
+ * @param connectionDetails - Details about the values that were used to create the connector to the cluster. (not null)
+ * @param client - Provides programatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoInstanceExists(final MongoConnectionDetails connectionDetails, final MongoClient client) {
+ super(connectionDetails, client);
+ }
+
+ @Override
+ public boolean exists(final String instanceName) {
+ requireNonNull( instanceName );
+ return super.getClient().getDatabaseNames().contains(instanceName);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoListInstances.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoListInstances.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoListInstances.java
new file mode 100644
index 0000000..d301bf2
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoListInstances.java
@@ -0,0 +1,68 @@
+/**
+ * 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.mongo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.rya.api.client.ListInstances;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
+
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link ListInstances} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoListInstances extends MongoCommand implements ListInstances {
+ /**
+ * Constructs an instance of {@link MongoListInstances}.
+ *
+ * @param connectionDetails
+ * - Details about the values that were used to create the connector to the cluster. (not null)
+ * @param client
+ * - Provides programatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoListInstances(final MongoConnectionDetails connectionDetails, final MongoClient client) {
+ super(connectionDetails, client);
+ }
+
+ @Override
+ public List<String> listInstances() throws RyaClientException {
+ final MongoClient client = super.getClient();
+ final List<String> dbNames = client.getDatabaseNames();
+ final List<String> ryaInstances = new ArrayList<>();
+ for (final String db : dbNames) {
+ final Set<String> collNames = client.getDB(db).getCollectionNames();
+ for (final String coll : collNames) {
+ if (coll.equals(MongoRyaInstanceDetailsRepository.INSTANCE_DETAILS_COLLECTION_NAME)) {
+ ryaInstances.add(db);
+ break;
+ }
+ }
+ }
+ return ryaInstances;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatements.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatements.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatements.java
new file mode 100644
index 0000000..844489d
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatements.java
@@ -0,0 +1,29 @@
+package org.apache.rya.api.client.mongo;
+
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+import org.apache.rya.api.client.LoadStatements;
+import org.apache.rya.api.client.RyaClientException;
+import org.openrdf.model.Statement;
+
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link LoadStatements} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoLoadStatements extends MongoCommand implements LoadStatements {
+
+ public MongoLoadStatements(MongoConnectionDetails connectionDetails, MongoClient client) {
+ super(connectionDetails, client);
+ }
+
+ @Override
+ public void loadStatements(String ryaInstanceName, Iterable<? extends Statement> statements) throws InstanceDoesNotExistException, RyaClientException {
+ // TODO Auto-generated method stub
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFile.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFile.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFile.java
new file mode 100644
index 0000000..bf525c1
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFile.java
@@ -0,0 +1,87 @@
+package org.apache.rya.api.client.mongo;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.log4j.Logger;
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+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.mongodb.MongoDBRdfConfiguration;
+import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
+import org.apache.rya.sail.config.RyaSailFactory;
+import org.openrdf.repository.RepositoryException;
+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.sail.Sail;
+import org.openrdf.sail.SailException;
+
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link LoadStatementsFile} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoLoadStatementsFile extends MongoCommand implements LoadStatementsFile {
+ private static final Logger log = Logger.getLogger(MongoLoadStatementsFile.class);
+
+ private final InstanceExists instanceExists;
+
+ /**
+ * Constructs an instance of {@link MongoListInstances}.
+ *
+ * @param connectionDetails
+ * - Details to connect to the server. (not null)
+ * @param client
+ * - Provides programmatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoLoadStatementsFile(MongoConnectionDetails connectionDetails, MongoClient client) {
+ super(connectionDetails, client);
+ instanceExists = new MongoInstanceExists(connectionDetails, client);
+ }
+
+ @Override
+ public void loadStatements(String ryaInstanceName, Path statementsFile, RDFFormat format) throws InstanceDoesNotExistException, RyaClientException {
+ requireNonNull(ryaInstanceName);
+ requireNonNull(statementsFile);
+ requireNonNull(format);
+
+ // 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;
+ // Get a Sail object that is connected to the Rya instance.
+ final MongoDBRdfConfiguration ryaConf = getMongoConnectionDetails().build(ryaInstanceName);
+ // ryaConf.setFlush(false); //Accumulo version said: RYA-327 should address this hardcoded value.
+ try {
+ sail = RyaSailFactory.getInstance(ryaConf);
+ } catch (SailException | AccumuloException | AccumuloSecurityException | RyaDAOException | InferenceEngineException e) {
+ throw new RyaClientException("While getting an sail instance.", e);
+ }
+
+ // Load the file.
+ sailRepo = new SailRepository(sail);
+ try {
+ sailRepoConn = sailRepo.getConnection();
+ sailRepoConn.add(statementsFile.toFile(), null, format);
+ } catch (RDFParseException | RepositoryException | IOException e) {
+ throw new RyaClientException("While getting a connection and adding statements from a file.", e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoRyaClientFactory.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoRyaClientFactory.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoRyaClientFactory.java
new file mode 100644
index 0000000..4ea3487
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoRyaClientFactory.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 org.apache.rya.api.client.mongo;
+
+import static java.util.Objects.requireNonNull;
+
+import org.apache.rya.api.client.RyaClient;
+
+import com.mongodb.MongoClient;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * Constructs instance of {@link RyaClient} that are connected to instance of
+ * Rya hosted by Mongo clusters.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoRyaClientFactory {
+
+ /**
+ * Initialize a set of {@link RyaClient} that will interact with an instance of
+ * Rya that is hosted by a MongoDB server.
+ *
+ * @param connectionDetails - Details about the values that were used to create the connector to the cluster. (not null)
+ * @param connector - The MongoDB connector the commands will use. (not null)
+ * @return The initialized commands.
+ */
+ public static RyaClient build(
+ final MongoConnectionDetails connectionDetails,
+ final MongoClient connector) {
+ requireNonNull(connectionDetails);
+ requireNonNull(connector);
+
+ // Build the RyaCommands option with the initialized commands.
+ return new RyaClient(//
+ new MongoInstall(connectionDetails, connector), //
+ new MongoCreatePCJ(connectionDetails, connector), //
+ new MongoDeletePCJ(connectionDetails, connector), //
+ null, null, null, null,
+ new MongoGetInstanceDetails(connectionDetails, connector), //
+ new MongoInstanceExists(connectionDetails, connector), //
+ new MongoListInstances(connectionDetails, connector), //
+ null, null,
+ new MongoUninstall(connectionDetails, connector), //
+ new MongoLoadStatements(connectionDetails, connector), //
+ new MongoLoadStatementsFile(connectionDetails, connector), //
+ null);// FIXME new MongoExecuteSparqlQuery(connectionDetails, connector));
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoUninstall.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoUninstall.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoUninstall.java
new file mode 100644
index 0000000..b3988b8
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoUninstall.java
@@ -0,0 +1,61 @@
+/**
+ * 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.mongo;
+
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.api.client.Uninstall;
+
+import com.mongodb.MongoClient;
+import com.mongodb.MongoException;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Mongo implementation of the {@link Uninstall} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class MongoUninstall extends MongoCommand implements Uninstall {
+
+ /**
+ * Constructs an instance of {@link MongoUninstall}.
+ *
+ * @param connectionDetails
+ * - Details about the values that were used to create the connector to the cluster. (not null)
+ * @param connector
+ * - Provides programatic access to the instance of Mongo
+ * that hosts Rya instance. (not null)
+ */
+ public MongoUninstall(final MongoConnectionDetails connectionDetails, final MongoClient client) {
+ super(connectionDetails, client);
+ }
+
+ @Override
+ public void uninstall(final String ryaInstanceName) throws InstanceDoesNotExistException, RyaClientException {
+ try {
+ if (!getClient().getDatabaseNames().contains(ryaInstanceName)) {
+ throw new InstanceDoesNotExistException("The database '" + ryaInstanceName + "' does not exist.");
+ }
+ getClient().dropDatabase(ryaInstanceName);
+ } catch (final MongoException e) {
+ throw new RyaClientException("Failed to uninstall '" + ryaInstanceName + "' " + e.getLocalizedMessage(), e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetailsIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetailsIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetailsIT.java
new file mode 100644
index 0000000..843ba42
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetailsIT.java
@@ -0,0 +1,123 @@
+/**
+ * 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.mongo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.Date;
+
+import org.apache.accumulo.core.client.TableExistsException;
+import org.apache.rya.api.client.GetInstanceDetails;
+import org.apache.rya.api.client.Install;
+import org.apache.rya.api.client.Install.InstallConfiguration;
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.api.instance.RyaDetails;
+import org.apache.rya.api.instance.RyaDetails.EntityCentricIndexDetails;
+import org.apache.rya.api.instance.RyaDetails.FreeTextIndexDetails;
+import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
+import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
+import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
+import org.apache.rya.api.instance.RyaDetails.TemporalIndexDetails;
+import org.apache.rya.mongodb.MongoTestBase;
+import org.junit.Test;
+
+import com.google.common.base.Optional;
+import com.mongodb.BasicDBObject;
+import com.mongodb.MongoException;
+
+/**
+ * Tests the methods of {@link MongoGetInstanceDetails}.
+ */
+public class MongoGetInstanceDetailsIT extends MongoTestBase {
+
+ @Test
+ public void getDetails() throws MongoException, RyaClientException {
+ final String instanceName = "instance";
+ // Install an instance of Rya.
+ final InstallConfiguration installConfig = InstallConfiguration.builder()
+ .setEnableTableHashPrefix(true)
+ .setEnableEntityCentricIndex(true)
+ .setEnableFreeTextIndex(true)
+ .setEnableTemporalIndex(true)
+ .setEnableGeoIndex(true)
+ .setEnablePcjIndex(false)
+ .build();
+
+ final Install install = new MongoInstall(getConnectionDetails(), this.getMongoClient());
+ install.install(instanceName, installConfig);
+
+ // Verify the correct details were persisted.
+ final GetInstanceDetails getInstanceDetails = new MongoGetInstanceDetails(getConnectionDetails(), this.getMongoClient());
+ final Optional<RyaDetails> details = getInstanceDetails.getDetails(instanceName);
+
+ final RyaDetails expectedDetails = RyaDetails.builder()
+ .setRyaInstanceName(instanceName)
+
+ // The version depends on how the test is packaged, so just grab whatever was stored.
+ .setRyaVersion( details.get().getRyaVersion() )
+
+ // FIXME .setGeoIndexDetails( new GeoIndexDetails(true) )
+ .setTemporalIndexDetails(new TemporalIndexDetails(true) )
+ .setFreeTextDetails( new FreeTextIndexDetails(true) )
+ .setEntityCentricIndexDetails( new EntityCentricIndexDetails(false) )
+ .setPCJIndexDetails(
+ PCJIndexDetails.builder()
+ .setEnabled(false))
+ .setProspectorDetails( new ProspectorDetails(Optional.<Date>absent()) )
+ .setJoinSelectivityDetails( new JoinSelectivityDetails(Optional.<Date>absent()) )
+ .build();
+
+ assertEquals(expectedDetails, details.get());
+ }
+
+ @Test(expected = InstanceDoesNotExistException.class)
+ public void getDetails_instanceDoesNotExist() throws MongoException, RyaClientException {
+ final GetInstanceDetails getInstanceDetails = new MongoGetInstanceDetails(getConnectionDetails(), conf.getMongoClient());
+ getInstanceDetails.getDetails("instance_name");
+ }
+
+ @Test
+ public void getDetails_instanceDoesNotHaveDetails() throws MongoException, TableExistsException, RyaClientException {
+ // Mimic a pre-details rya install.
+ final String instanceName = "instance_name";
+
+ this.getMongoClient().getDB(instanceName).createCollection("rya_triples", new BasicDBObject());
+
+ // Verify that the operation returns empty.
+ final GetInstanceDetails getInstanceDetails = new MongoGetInstanceDetails(getConnectionDetails(), this.getMongoClient());
+ final Optional<RyaDetails> details = getInstanceDetails.getDetails(instanceName);
+ assertFalse( details.isPresent() );
+ }
+
+ /**
+ * @return copy from conf to MongoConnectionDetails
+ */
+ private MongoConnectionDetails getConnectionDetails() {
+ final MongoConnectionDetails connectionDetails = new MongoConnectionDetails(
+ conf.getMongoUser(), //
+ conf.getMongoPassword().toCharArray(), //
+ conf.getMongoDBName(), // aka instance
+ conf.getMongoInstance(), // aka hostname
+ conf.getCollectionName()
+ );
+ return connectionDetails;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstallIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstallIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstallIT.java
new file mode 100644
index 0000000..e9dae1c
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstallIT.java
@@ -0,0 +1,105 @@
+/**
+ * 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.mongo;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.rya.api.client.Install;
+import org.apache.rya.api.client.Install.DuplicateInstanceNameException;
+import org.apache.rya.api.client.Install.InstallConfiguration;
+import org.apache.rya.api.client.InstanceExists;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.api.client.accumulo.AccumuloInstall;
+import org.apache.rya.mongodb.MongoTestBase;
+import org.junit.Test;
+
+/**
+ * Integration tests the methods of {@link AccumuloInstall}.
+ */
+public class MongoInstallIT extends MongoTestBase {
+
+ @Test
+ public void install() throws DuplicateInstanceNameException, RyaClientException {
+ // Install an instance of Rya.
+ final String instanceName = conf.getCollectionName();
+ final InstallConfiguration installConfig = InstallConfiguration.builder()
+ .setEnableTableHashPrefix(false) //
+ .setEnableEntityCentricIndex(false)//
+ .setEnableFreeTextIndex(false)//
+ .setEnableTemporalIndex(false)//
+ .setEnablePcjIndex(false)//
+ .setEnableGeoIndex(false)//
+ .setFluoPcjAppName("fluo_app_name")//
+ .build();
+
+ final MongoConnectionDetails connectionDetails = new MongoConnectionDetails(
+ conf.getMongoUser(), //
+ conf.getMongoPassword().toCharArray(), //
+ conf.getMongoDBName(), // aka instance
+ conf.getMongoInstance(), // aka hostname
+ conf.getCollectionName()
+ );
+
+ // Check that the instance does not exist.
+ assertFalse("Instance should NOT exist yet.", this.getMongoClient().getDatabaseNames().contains(instanceName));
+ final InstanceExists instanceExists = new MongoInstanceExists(connectionDetails, this.getMongoClient());
+ assertFalse("Instance should NOT exist yet.", instanceExists.exists(instanceName));
+
+ final Install install = new MongoInstall(connectionDetails, this.getMongoClient());
+ install.install(instanceName, installConfig);
+
+ // Check that the instance exists.
+ assertTrue("Instance should exist.", this.getMongoClient().getDatabaseNames().contains(instanceName));
+ List<String> expected = Arrays.asList("instance_details", instanceName + "_triples");
+ int count = 0;
+ String found = "";
+ for (String collection : this.getMongoClient().getDatabase(instanceName).listCollectionNames())
+ {
+ System.out.println("Collection names:" + collection);
+ count += expected.contains(collection) ? 1 : 0;
+ found += ", " + collection;
+ }
+ assertTrue("Tables missing from:" + expected + " actual:" + found, expected.size() == count);
+ assertTrue("Instance should exist.", instanceExists.exists(instanceName));
+ }
+
+ @Test(expected = DuplicateInstanceNameException.class)
+ public void install_alreadyExists() throws DuplicateInstanceNameException, RyaClientException {
+ // Install an instance of Rya.
+ final String instanceName = conf.getCollectionName();
+ final InstallConfiguration installConfig = InstallConfiguration.builder().build();
+
+ final MongoConnectionDetails connectionDetails = new MongoConnectionDetails(conf.getMongoUser(), //
+ conf.getMongoPassword().toCharArray(), //
+ conf.getMongoDBName(), // aka instance
+ conf.getMongoInstance(), // aka hostname
+ conf.getCollectionName()
+ );
+
+ final Install install = new MongoInstall(connectionDetails, this.getMongoClient());
+ install.install(instanceName, installConfig);
+
+ // Install it again throws expected error.
+ install.install(instanceName, installConfig);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstanceExistsIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstanceExistsIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstanceExistsIT.java
new file mode 100644
index 0000000..35568bc
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstanceExistsIT.java
@@ -0,0 +1,86 @@
+/**
+ * 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.mongo;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.accumulo.core.client.TableExistsException;
+import org.apache.rya.api.client.accumulo.AccumuloInstanceExists;
+import org.apache.rya.mongodb.MongoTestBase;
+import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
+import org.junit.Test;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.MongoClient;
+import com.mongodb.MongoException;
+
+/**
+ * Integration tests the methods of {@link AccumuloInstanceExists}.
+ */
+public class MongoInstanceExistsIT extends MongoTestBase {
+
+ @Test
+ public void exists_ryaDetailsTable() throws MongoException, TableExistsException {
+ final MongoClient client = getMongoClient();
+
+ // Create the Rya instance's Rya details collection.
+ final String instanceName = "test_instance_";
+ client.getDB(instanceName).createCollection(MongoRyaInstanceDetailsRepository.INSTANCE_DETAILS_COLLECTION_NAME, new BasicDBObject());
+
+ // Verify the command reports the instance exists.
+ final MongoInstanceExists instanceExists = new MongoInstanceExists(getConnectionDetails(), client);
+ assertTrue( instanceExists.exists(instanceName) );
+ }
+
+ @Test
+ public void exists_dataTables() throws MongoException, TableExistsException {
+ final MongoClient client = getMongoClient();
+
+ // Create the Rya instance's Rya triples collection.
+ final String instanceName = "test_instance_";
+ client.getDB(instanceName).createCollection("rya_triples", new BasicDBObject());
+
+ // Verify the command reports the instance exists.
+ final MongoInstanceExists instanceExists = new MongoInstanceExists(getConnectionDetails(), client);
+ assertTrue( instanceExists.exists(instanceName) );
+ }
+
+ @Test
+ public void doesNotExist() throws MongoException {
+ // Verify the command reports the instance does not exists.
+ final MongoInstanceExists instanceExists = new MongoInstanceExists(getConnectionDetails(), getMongoClient());
+ assertFalse( instanceExists.exists("some_instance") );
+ }
+
+ /**
+ * @return copy from conf to MongoConnectionDetails
+ */
+ private MongoConnectionDetails getConnectionDetails() {
+ final MongoConnectionDetails connectionDetails = new MongoConnectionDetails(conf.getMongoUser(), //
+ conf.getMongoPassword().toCharArray(), //
+ conf.getMongoDBName(), // aka instance
+ conf.getMongoInstance(), // aka hostname
+ conf.getCollectionName()
+ );
+ return connectionDetails;
+ }
+
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoListInstancesIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoListInstancesIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoListInstancesIT.java
new file mode 100644
index 0000000..7d5a2fe
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoListInstancesIT.java
@@ -0,0 +1,71 @@
+/**
+ * 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.mongo;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.rya.api.client.Install;
+import org.apache.rya.api.client.Install.DuplicateInstanceNameException;
+import org.apache.rya.api.client.Install.InstallConfiguration;
+import org.apache.rya.api.client.ListInstances;
+import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.mongodb.MongoTestBase;
+import org.junit.Test;
+
+import com.beust.jcommander.internal.Lists;
+import com.mongodb.MongoException;
+
+/**
+ * Integration tests the methods of {@link MongoListInstances}.
+ */
+public class MongoListInstancesIT extends MongoTestBase {
+
+ @Test
+ public void listInstances_hasRyaDetailsTable() throws MongoException, DuplicateInstanceNameException, RyaClientException {
+ // Install a few instances of Rya using the install command.
+ final Install install = new MongoInstall(getConnectionDetails(), getMongoClient());
+ install.install("instance1_", InstallConfiguration.builder().build());
+ install.install("instance2_", InstallConfiguration.builder().build());
+ install.install("instance3_", InstallConfiguration.builder().build());
+
+ // Fetch the list and verify it matches what is expected.
+ final ListInstances listInstances = new MongoListInstances(getConnectionDetails(), getMongoClient());
+ final List<String> instances = listInstances.listInstances();
+ Collections.sort(instances);
+
+ final List<String> expected = Lists.newArrayList("instance1_", "instance2_", "instance3_");
+ assertEquals(expected, instances);
+ }
+
+ /**
+ * @return copy from conf to MongoConnectionDetails
+ */
+ private MongoConnectionDetails getConnectionDetails() {
+ final MongoConnectionDetails connectionDetails = new MongoConnectionDetails(conf.getMongoUser(), //
+ conf.getMongoPassword().toCharArray(), //
+ conf.getMongoDBName(), // aka instance
+ conf.getMongoInstance(), // aka hostname
+ conf.getCollectionName()
+ );
+ return connectionDetails;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFileIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFileIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFileIT.java
new file mode 100644
index 0000000..6794d86
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFileIT.java
@@ -0,0 +1,132 @@
+/**
+ * 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.mongo;
+
+import static org.junit.Assert.assertEquals;
+
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.rya.api.client.Install;
+import org.apache.rya.api.client.Install.InstallConfiguration;
+import org.apache.rya.api.client.InstanceDoesNotExistException;
+import org.apache.rya.api.client.RyaClient;
+import org.apache.rya.mongodb.MongoTestBase;
+import org.bson.Document;
+import org.junit.Test;
+import org.openrdf.model.Statement;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.ValueFactoryImpl;
+import org.openrdf.rio.RDFFormat;
+
+import com.mongodb.client.MongoCursor;
+
+/**
+ * Integration tests the methods of {@link MongoLoadStatementsFile}.
+ */
+public class MongoLoadStatementsFileIT extends MongoTestBase {
+
+ @Test(expected = InstanceDoesNotExistException.class)
+ public void instanceDoesNotExist() throws Exception {
+
+ final RyaClient ryaClient = MongoRyaClientFactory.build(getConnectionDetails(), conf.getMongoClient());
+ ryaClient.getLoadStatementsFile().loadStatements(getConnectionDetails().getInstance(), Paths.get("src/test/resources/example.ttl"), RDFFormat.TURTLE);
+ }
+
+ @Test
+ public void loadTurtleFile() throws Exception {
+ // Install an instance of Rya.
+ final InstallConfiguration installConfig = InstallConfiguration.builder()
+ .setEnableTableHashPrefix(false)
+ .setEnableEntityCentricIndex(false)
+ .setEnableFreeTextIndex(false)
+ .setEnableTemporalIndex(false)
+ .setEnablePcjIndex(false)
+ .setEnableGeoIndex(false)
+ .build();
+ MongoConnectionDetails connectionDetails = getConnectionDetails();
+ final RyaClient ryaClient = MongoRyaClientFactory.build(connectionDetails, conf.getMongoClient());
+ final Install install = ryaClient.getInstall();
+ install.install(connectionDetails.getInstance(), installConfig);
+
+ // Load the test statement file.
+ ryaClient.getLoadStatementsFile().loadStatements( //
+ connectionDetails.getInstance(), //
+ Paths.get("src/test/resources/example.ttl"), //
+ RDFFormat.TURTLE);
+
+ // Verify that the statements were loaded.
+ final ValueFactory vf = new ValueFactoryImpl();
+
+ final List<Statement> expected = new ArrayList<>();
+ expected.add( vf.createStatement(vf.createURI("http://example#alice"), vf.createURI("http://example#talksTo"), vf.createURI("http://example#bob")) );
+ expected.add( vf.createStatement(vf.createURI("http://example#bob"), vf.createURI("http://example#talksTo"), vf.createURI("http://example#charlie")) );
+ expected.add( vf.createStatement(vf.createURI("http://example#charlie"), vf.createURI("http://example#likes"), vf.createURI("http://example#icecream")) );
+
+ final List<Statement> statements = new ArrayList<>();
+ MongoCursor<Document> x = getRyaCollection().find().iterator();
+ System.out.println("getRyaCollection().count()=" + getRyaCollection().count());
+ while (x.hasNext()) {
+ Document y = x.next();
+ System.out.println("getRyaCollection()=" + y);
+ }
+ assertEquals("Expect all rows to be read.", 3, getRyaCollection().count());
+ // final WholeRowTripleResolver tripleResolver = new WholeRowTripleResolver();
+ // final Scanner scanner = getConnector().createScanner(getRyaInstanceName() + "spo", new Authorizations());
+ // final Iterator<Entry<Key, Value>> it = scanner.iterator();
+ // while(it.hasNext()) {
+ // final Entry<Key, Value> next = it.next();
+ //
+ // final Key key = next.getKey();
+ // final byte[] row = key.getRow().getBytes();
+ // final byte[] columnFamily = key.getColumnFamily().getBytes();
+ // final byte[] columnQualifier = key.getColumnQualifier().getBytes();
+ // final TripleRow tripleRow = new TripleRow(row, columnFamily, columnQualifier);
+ //
+ // final RyaStatement ryaStatement = tripleResolver.deserialize(TABLE_LAYOUT.SPO, tripleRow);
+ // final Statement statement = RyaToRdfConversions.convertStatement(ryaStatement);
+ //
+ // // Filter out the rya version statement if it is present.
+ // if(!isRyaMetadataStatement(vf, statement)) {
+ // statements.add( statement );
+ // }
+ // }
+ //
+ // assertEquals(expected, statements);
+ }
+
+ 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") );
+ }
+ /**
+ * @return copy from conf to MongoConnectionDetails
+ */
+ private MongoConnectionDetails getConnectionDetails() {
+ final MongoConnectionDetails connectionDetails = new MongoConnectionDetails(//
+ conf.getMongoUser(), //
+ conf.getMongoPassword().toCharArray(), //
+ conf.getMongoDBName(), // aka instance
+ conf.getMongoInstance(), // aka hostname
+ conf.getCollectionName()
+ );
+ return connectionDetails;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/33a04863/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoUninstallIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoUninstallIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoUninstallIT.java
new file mode 100644
index 0000000..523b4b2
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoUninstallIT.java
@@ -0,0 +1,78 @@
+/**
+ * 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.mongo;
+
+import org.apache.rya.api.client.Install;
+import org.apache.rya.api.client.Install.InstallConfiguration;
+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.client.Uninstall;
+import org.apache.rya.mongodb.MongoTestBase;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.mongodb.MongoException;
+
+/**
+ * Integration tests the methods of {@link MongoInstall}.
+ */
+public class MongoUninstallIT extends MongoTestBase {
+
+ @Test
+ public void uninstall() throws MongoException, RyaClientException {
+ // Install an instance of Rya.
+ final String instanceName = "testInstance_";
+ final InstallConfiguration installConfig = InstallConfiguration.builder().setEnableTableHashPrefix(true).setEnableEntityCentricIndex(true).setEnableFreeTextIndex(true).setEnableTemporalIndex(true).setEnablePcjIndex(true).setEnableGeoIndex(true).setFluoPcjAppName("fluo_app_name").build();
+
+ final Install install = new MongoInstall(getConnectionDetails(), conf.getMongoClient());
+ install.install(instanceName, installConfig);
+
+ // Uninstall the instance
+ final Uninstall uninstall = new MongoUninstall(getConnectionDetails(), conf.getMongoClient());
+ uninstall.uninstall(instanceName);
+
+ // Check that the instance no longer exists.
+ final InstanceExists instanceExists = new MongoInstanceExists(getConnectionDetails(), conf.getMongoClient());
+ Assert.assertFalse(instanceExists.exists(instanceName));
+ }
+
+ @Test(expected = InstanceDoesNotExistException.class)
+ public void uninstall_instanceDoesNotExists() throws MongoException, RyaClientException {
+ // Install an instance of Rya.
+ final String instanceName = "testInstance_";
+
+ // Uninstall the instance
+ final Uninstall uninstall = new MongoUninstall(getConnectionDetails(), conf.getMongoClient());
+ uninstall.uninstall(instanceName);
+ }
+
+ /**
+ * @return copy from conf to MongoConnectionDetails
+ */
+ private MongoConnectionDetails getConnectionDetails() {
+ final MongoConnectionDetails connectionDetails = new MongoConnectionDetails(conf.getMongoUser(), //
+ conf.getMongoPassword().toCharArray(), //
+ conf.getMongoDBName(), // aka instance
+ conf.getMongoInstance(), // aka hostname
+ conf.getCollectionName()
+ );
+ return connectionDetails;
+ }
+}
\ No newline at end of file