You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by mi...@apache.org on 2016/11/01 17:12:05 UTC

[3/7] incubator-rya git commit: RYA-106 Implemented AddUser and RemoveUser commands to the RyaClient as well as their Accumulo implementations. This ensures all tables associated with a Rya instance will have table permissions applied to the users that a

RYA-106 Implemented AddUser and RemoveUser commands to the RyaClient as well as their Accumulo implementations. This ensures all tables associated with a Rya instance will have table permissions applied to the users that are allowed to access them.

Closes #91


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

Branch: refs/heads/master
Commit: ab4fca461a8b5f34be46aee22f183d60b499c9a8
Parents: ed0b0f7
Author: Kevin Chilton <ke...@parsons.com>
Authored: Mon Sep 12 22:32:28 2016 -0400
Committer: Aaron Mihalik <aa...@gmail.com>
Committed: Tue Nov 1 10:49:04 2016 -0400

----------------------------------------------------------------------
 .../java/org/apache/rya/api/client/AddUser.java |  39 +++
 .../org/apache/rya/api/client/RemoveUser.java   |  39 +++
 .../org/apache/rya/api/client/RyaClient.java    |  30 +-
 .../org/apache/rya/api/instance/RyaDetails.java |  88 +++--
 .../api/instance/RyaDetailsToConfiguration.java |   2 +-
 .../apache/rya/api/instance/RyaDetailsTest.java |  14 +-
 .../instance/RyaDetailsToConfigurationTest.java |  13 +-
 .../rya/api/instance/RyaDetailsUpdaterTest.java |  12 +-
 .../AccumuloRyaInstanceDetailsRepository.java   |  21 +-
 .../rya/accumulo/utils/TablePermissions.java    | 102 ++++++
 .../apache/rya/accumulo/AccumuloRyaITBase.java  |   2 +-
 .../accumulo/MiniAccumuloClusterInstance.java   |   2 +-
 .../AccumuloRyaDetailsRepositoryIT.java         |  35 +-
 .../mongodb/instance/MongoDetailsAdapter.java   |  20 +-
 .../instance/MongoDetailsAdapterTest.java       |  30 +-
 .../instance/MongoRyaDetailsRepositoryIT.java   |  57 +++-
 .../rya/accumulo/utils/RyaTableNames.java       | 117 +++++++
 .../api/client/accumulo/AccumuloAddUser.java    | 106 ++++++
 .../api/client/accumulo/AccumuloCommand.java    |   5 +-
 .../api/client/accumulo/AccumuloInstall.java    |  29 +-
 .../api/client/accumulo/AccumuloRemoveUser.java |  95 ++++++
 .../accumulo/AccumuloRyaClientFactory.java      |   5 +-
 .../accumulo/entity/EntityCentricIndex.java     |  68 ++--
 .../freetext/AccumuloFreeTextIndexer.java       | 325 +++++++++++--------
 .../temporal/AccumuloTemporalIndexer.java       |  33 +-
 .../api/client/accumulo/AccumuloAddUserIT.java  | 267 +++++++++++++++
 .../accumulo/AccumuloBatchUpdatePCJIT.java      |  17 +-
 .../accumulo/AccumuloGetInstanceDetailsIT.java  |  10 +-
 .../client/accumulo/AccumuloRemoveUserIT.java   | 168 ++++++++++
 .../AccumuloIndexSetColumnVisibilityTest.java   |  32 +-
 .../org/apache/rya/shell/RyaAdminCommands.java  | 111 ++++---
 .../rya/shell/util/RyaDetailsFormatter.java     |  12 +-
 .../apache/rya/shell/RyaAdminCommandsTest.java  |  91 +++---
 .../rya/shell/util/RyaDetailsFormatterTest.java |  18 +-
 .../accumulo/geo/GeoMesaGeoIndexer.java         |  47 +--
 .../storage/accumulo/AccumuloPcjStorage.java    |  59 ++--
 .../rya/indexing/pcj/fluo/demo/DemoDriver.java  |  38 +--
 37 files changed, 1638 insertions(+), 521 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/common/rya.api/src/main/java/org/apache/rya/api/client/AddUser.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/client/AddUser.java b/common/rya.api/src/main/java/org/apache/rya/api/client/AddUser.java
new file mode 100644
index 0000000..623f0e1
--- /dev/null
+++ b/common/rya.api/src/main/java/org/apache/rya/api/client/AddUser.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;
+
+/**
+ * Grants a user access to an instance of Rya.
+ */
+@DefaultAnnotation(NonNull.class)
+public interface AddUser {
+
+    /**
+     * Grants access to a specific Rya instance to a user of the storage system.
+     *
+     * @param instanceName - Indicates which Rya instance will be granted to the user. (not null)
+     * @param username - The user whose access will be granted. (not null)
+     * @throws InstanceDoesNotExistException No instance of Rya exists for the provided name.
+     * @throws RyaClientException Something caused the command to fail.
+     */
+    public void addUser(String instanceName, String username) throws InstanceDoesNotExistException, RyaClientException;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/common/rya.api/src/main/java/org/apache/rya/api/client/RemoveUser.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/client/RemoveUser.java b/common/rya.api/src/main/java/org/apache/rya/api/client/RemoveUser.java
new file mode 100644
index 0000000..641649c
--- /dev/null
+++ b/common/rya.api/src/main/java/org/apache/rya/api/client/RemoveUser.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;
+
+/**
+ * Revokes a user's access to an instance of Rya.
+ */
+@DefaultAnnotation(NonNull.class)
+public interface RemoveUser {
+
+    /**
+     * Revokes access to a specific Rya instance from a user of the storage system.
+     *
+     * @param instanceName - Indicates which Rya instance will be revoked from the user. (not null)
+     * @param username - The user whose access will be revoked. (not null)
+     * @throws InstanceDoesNotExistException No instance of Rya exists for the provided name.
+     * @throws RyaClientException Something caused the command to fail.
+     */
+    public void removeUser(String instanceName, String username) throws InstanceDoesNotExistException, RyaClientException;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/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 e43dfce..b290957 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
@@ -34,10 +34,12 @@ public class RyaClient {
     private final Install install;
     private final CreatePCJ createPcj;
     private final DeletePCJ deletePcj;
-    private final BatchUpdatePCJ batchUpdatePcj;
+    private final BatchUpdatePCJ bactchUpdatePCJ;
     private final GetInstanceDetails getInstanceDetails;
     private final InstanceExists instanceExists;
     private final ListInstances listInstances;
+    private final AddUser addUser;
+    private final RemoveUser removeUser;
 
     /**
      * Constructs an instance of {@link RyaClient}.
@@ -49,14 +51,18 @@ public class RyaClient {
             final BatchUpdatePCJ batchUpdatePcj,
             final GetInstanceDetails getInstanceDetails,
             final InstanceExists instanceExists,
-            final ListInstances listInstances) {
+            final ListInstances listInstances,
+            final AddUser addUser,
+            final RemoveUser removeUser) {
         this.install = requireNonNull(install);
         this.createPcj = requireNonNull(createPcj);
         this.deletePcj = requireNonNull(deletePcj);
-        this.batchUpdatePcj = requireNonNull(batchUpdatePcj);
+        bactchUpdatePCJ = requireNonNull(batchUpdatePcj);
         this.getInstanceDetails = requireNonNull(getInstanceDetails);
         this.instanceExists = requireNonNull(instanceExists);
         this.listInstances = requireNonNull(listInstances);
+        this.addUser = requireNonNull(addUser);
+        this.removeUser = requireNonNull(removeUser);
     }
 
     /**
@@ -83,11 +89,11 @@ public class RyaClient {
     }
 
     /**
-     * @return An instnace of {@link BatchUpdatePCJ} that is connected to a Rya storage
+     * @return An instance of {@link BatchUpdatePCJ} that is connect to a Rya storage
      *   if the Rya instance supports PCJ indexing.
      */
     public BatchUpdatePCJ getBatchUpdatePCJ() {
-        return batchUpdatePcj;
+        return bactchUpdatePCJ;
     }
 
     /**
@@ -110,4 +116,18 @@ public class RyaClient {
     public InstanceExists getInstanceExists() {
         return instanceExists;
     }
+
+    /**
+     * @return An instance of {@link AddUser} that is connected to a Rya storage.
+     */
+    public AddUser getAddUser() {
+        return addUser;
+    }
+
+    /**
+     * @return An instance of {@link DeleteUser} that is connected to a Rya storage.
+     */
+    public RemoveUser getRemoveUser() {
+        return removeUser;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetails.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetails.java b/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetails.java
index 09085f3..9d2c1e5 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetails.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetails.java
@@ -1,6 +1,4 @@
-package org.apache.rya.api.instance;
-
-/*
+/**
  * 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
@@ -9,7 +7,7 @@ package org.apache.rya.api.instance;
  * "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
+ *     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
@@ -18,12 +16,15 @@ package org.apache.rya.api.instance;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.api.instance;
 
 import static java.util.Objects.requireNonNull;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
@@ -33,7 +34,11 @@ import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
 import net.jcip.annotations.Immutable;
 
+import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
+import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails;
+
 import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 /**
@@ -47,10 +52,14 @@ public class RyaDetails implements Serializable {
     // General metadata about the instance.
     private final String instanceName;
     private final String version;
+    private final ImmutableList<String> users;
 
     // Secondary Index Details.
     private final EntityCentricIndexDetails entityCentricDetails;
-    private final GeoIndexDetails geoDetails;
+    /**
+     * RYA- 215
+     * private final GeoIndexDetails geoDetails;
+     */
     private final PCJIndexDetails pcjDetails;
     private final TemporalIndexDetails temporalDetails;
     private final FreeTextIndexDetails freeTextDetails;
@@ -66,8 +75,9 @@ public class RyaDetails implements Serializable {
     private RyaDetails(
             final String instanceName,
             final String version,
+            final ImmutableList<String> users,
             final EntityCentricIndexDetails entityCentricDetails,
-            final GeoIndexDetails geoDetails,
+//RYA-215            final GeoIndexDetails geoDetails,
             final PCJIndexDetails pcjDetails,
             final TemporalIndexDetails temporalDetails,
             final FreeTextIndexDetails freeTextDetails,
@@ -75,8 +85,9 @@ public class RyaDetails implements Serializable {
             final JoinSelectivityDetails joinSelectivityDetails) {
         this.instanceName = requireNonNull(instanceName);
         this.version = requireNonNull(version);
+        this.users = requireNonNull(users);
         this.entityCentricDetails = requireNonNull(entityCentricDetails);
-        this.geoDetails = requireNonNull(geoDetails);
+      //RYA-215        this.geoDetails = requireNonNull(geoDetails);
         this.pcjDetails = requireNonNull(pcjDetails);
         this.temporalDetails = requireNonNull(temporalDetails);
         this.freeTextDetails = requireNonNull(freeTextDetails);
@@ -100,6 +111,13 @@ public class RyaDetails implements Serializable {
     }
 
     /**
+     * @return The users who have been granted access to the Rya instance.
+     */
+    public ImmutableList<String> getUsers() {
+        return users;
+    }
+
+    /**
      * @return Information about the instance's Entity Centric Index.
      */
     public EntityCentricIndexDetails getEntityCentricIndexDetails() {
@@ -108,10 +126,12 @@ public class RyaDetails implements Serializable {
 
     /**
      * @return Information about the instance's Geospatial Index.
+     *
+     * RYA-215
      */
-    public GeoIndexDetails getGeoIndexDetails() {
+/*    public GeoIndexDetails getGeoIndexDetails() {
         return geoDetails;
-    }
+    }*/
 
     /**
      * @return Information about the instance's Precomputed Join Index.
@@ -154,7 +174,7 @@ public class RyaDetails implements Serializable {
                 instanceName,
                 version,
                 entityCentricDetails,
-                geoDetails,
+              //RYA-215                geoDetails,
                 pcjDetails,
                 temporalDetails,
                 freeTextDetails,
@@ -172,7 +192,7 @@ public class RyaDetails implements Serializable {
             return Objects.equals(instanceName, details.instanceName) &&
                     Objects.equals(version, details.version) &&
                     Objects.equals(entityCentricDetails, details.entityCentricDetails) &&
-                    Objects.equals(geoDetails, details.geoDetails) &&
+                  //RYA-215                    Objects.equals(geoDetails, details.geoDetails) &&
                     Objects.equals(pcjDetails, details.pcjDetails) &&
                     Objects.equals(temporalDetails, details.temporalDetails) &&
                     Objects.equals(freeTextDetails, details.freeTextDetails) &&
@@ -206,6 +226,7 @@ public class RyaDetails implements Serializable {
         // General metadata about the instance.
         private String instanceName;
         private String version;
+        private final List<String> users = new ArrayList<>();
 
         // Secondary Index Details.
         private EntityCentricIndexDetails entityCentricDetails;
@@ -233,8 +254,9 @@ public class RyaDetails implements Serializable {
             requireNonNull(details);
             instanceName = details.instanceName;
             version = details.version;
+            users.addAll( details.users );
             entityCentricDetails = details.entityCentricDetails;
-            geoDetails = details.geoDetails;
+          //RYA-215            geoDetails = details.geoDetails;
             pcjIndexDetailsBuilder = PCJIndexDetails.builder( details.pcjDetails );
             temporalDetails = details.temporalDetails;
             freeTextDetails = details.freeTextDetails;
@@ -262,6 +284,24 @@ public class RyaDetails implements Serializable {
         }
 
         /**
+         * @param user - A user who is granted access to the Rya instance.
+         * @return This {@link Builder} so that method invocations may be chained.
+         */
+        public Builder addUser(final String user) {
+            users.add( user );
+            return this;
+        }
+
+        /**
+         * @param user - A user who is revoked access to the Rya isntance.
+         * @return This {@link Builder} so that method invocations may be chained.
+         */
+        public Builder removeUser(final String user) {
+            users.remove( user );
+            return this;
+        }
+
+        /**
          * @param entityCentricDetails - Information about the instance's Entity Centric Index.
          * @return This {@link Builder} so that method invocations may be chained.
          */
@@ -275,10 +315,11 @@ public class RyaDetails implements Serializable {
          * @param geoDetails - Information about the instance's Geospatial Index.
          * @return This {@link Builder} so that method invocations may be chained.
          */
-        public Builder setGeoIndexDetails(@Nullable final GeoIndexDetails geoDetails) {
+        /*//RYA-215
+         * public Builder setGeoIndexDetails(@Nullable final GeoIndexDetails geoDetails) {
             this.geoDetails = geoDetails;
             return this;
-        }
+        }*/
 
         /**
          * @param temporalDetails - Information about the instance's Temporal Index.
@@ -303,7 +344,7 @@ public class RyaDetails implements Serializable {
          * @return This {@link Builder} so that method invocations may be chained.
          */
         public Builder setPCJIndexDetails(@Nullable final PCJIndexDetails.Builder pcjDetailsBuilder) {
-            this.pcjIndexDetailsBuilder = pcjDetailsBuilder;
+            pcjIndexDetailsBuilder = pcjDetailsBuilder;
             return this;
         }
 
@@ -341,8 +382,9 @@ public class RyaDetails implements Serializable {
             return new RyaDetails(
                     instanceName,
                     version,
+                    ImmutableList.copyOf( users ),
                     entityCentricDetails,
-                    geoDetails,
+                  //RYA-215                    geoDetails,
                     pcjIndexDetailsBuilder.build(),
                     temporalDetails,
                     freeTextDetails,
@@ -640,8 +682,8 @@ public class RyaDetails implements Serializable {
              */
             public Builder(final PCJIndexDetails pcjIndexDetails) {
                 requireNonNull(pcjIndexDetails);
-                this.enabled = pcjIndexDetails.enabled;
-                this.fluoDetails = pcjIndexDetails.fluoDetails.orNull();
+                enabled = pcjIndexDetails.enabled;
+                fluoDetails = pcjIndexDetails.fluoDetails.orNull();
 
                 for(final PCJDetails pcjDetails : pcjIndexDetails.pcjDetails.values()) {
                     pcjDetailsBuilders.put(pcjDetails.getId(), PCJDetails.builder(pcjDetails));
@@ -673,7 +715,7 @@ public class RyaDetails implements Serializable {
              */
             public Builder addPCJDetails(@Nullable final PCJDetails.Builder pcjDetailsBuilder) {
                 if(pcjDetailsBuilder != null) {
-                    this.pcjDetailsBuilders.put(pcjDetailsBuilder.getId(), pcjDetailsBuilder);
+                    pcjDetailsBuilders.put(pcjDetailsBuilder.getId(), pcjDetailsBuilder);
                 }
                 return this;
             }
@@ -684,7 +726,7 @@ public class RyaDetails implements Serializable {
              */
             public Builder removePCJDetails(@Nullable final String pcjId) {
                 requireNonNull(pcjId);
-                this.pcjDetailsBuilders.remove(pcjId);
+                pcjDetailsBuilders.remove(pcjId);
                 return this;
             }
 
@@ -859,9 +901,9 @@ public class RyaDetails implements Serializable {
                  */
                 public Builder(final PCJDetails details) {
                     requireNonNull(details);
-                    this.id = details.id;
-                    this.updateStrategy = details.updateStrategy.orNull();
-                    this.lastUpdateTime = details.lastUpdateTime.orNull();
+                    id = details.id;
+                    updateStrategy = details.updateStrategy.orNull();
+                    lastUpdateTime = details.lastUpdateTime.orNull();
                 }
 
                 /**

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetailsToConfiguration.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetailsToConfiguration.java b/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetailsToConfiguration.java
index 0d0191a..adc2498 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetailsToConfiguration.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/instance/RyaDetailsToConfiguration.java
@@ -50,7 +50,7 @@ public class RyaDetailsToConfiguration {
 
         checkAndSet(conf, ConfigurationFields.USE_ENTITY, details.getEntityCentricIndexDetails().isEnabled());
         checkAndSet(conf, ConfigurationFields.USE_FREETEXT, details.getFreeTextIndexDetails().isEnabled());
-        checkAndSet(conf, ConfigurationFields.USE_GEO, details.getGeoIndexDetails().isEnabled());
+      //RYA-215        checkAndSet(conf, ConfigurationFields.USE_GEO, details.getGeoIndexDetails().isEnabled());
         checkAndSet(conf, ConfigurationFields.USE_TEMPORAL, details.getTemporalIndexDetails().isEnabled());
         checkAndSet(conf, ConfigurationFields.USE_PCJ, details.getPCJIndexDetails().isEnabled());
     }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsTest.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsTest.java b/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsTest.java
index 5227b0c..a356877 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsTest.java
@@ -23,13 +23,8 @@ import static org.junit.Assert.assertEquals;
 
 import java.util.Date;
 
-import org.junit.Test;
-
-import com.google.common.base.Optional;
-
 import org.apache.rya.api.instance.RyaDetails.EntityCentricIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.FreeTextIndexDetails;
-import org.apache.rya.api.instance.RyaDetails.GeoIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.FluoDetails;
@@ -37,6 +32,9 @@ import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails.PCJUpdateStrategy;
 import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
 import org.apache.rya.api.instance.RyaDetails.TemporalIndexDetails;
+import org.junit.Test;
+
+import com.google.common.base.Optional;
 
 /**
  * Tests the methods of {@link RyaDetails}.
@@ -50,7 +48,7 @@ public class RyaDetailsTest {
         builder.setRyaInstanceName("test_instance")
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -81,7 +79,7 @@ public class RyaDetailsTest {
         builder.setRyaInstanceName("test_instance")
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -111,7 +109,7 @@ public class RyaDetailsTest {
             .setRyaInstanceName("test_instance")
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsToConfigurationTest.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsToConfigurationTest.java b/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsToConfigurationTest.java
index a391dac..0cb5c77 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsToConfigurationTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsToConfigurationTest.java
@@ -21,7 +21,6 @@ package org.apache.rya.api.instance;
 
 import static org.apache.rya.api.instance.ConfigurationFields.USE_ENTITY;
 import static org.apache.rya.api.instance.ConfigurationFields.USE_FREETEXT;
-import static org.apache.rya.api.instance.ConfigurationFields.USE_GEO;
 import static org.apache.rya.api.instance.ConfigurationFields.USE_PCJ;
 import static org.apache.rya.api.instance.ConfigurationFields.USE_TEMPORAL;
 import static org.junit.Assert.assertFalse;
@@ -30,13 +29,8 @@ import static org.junit.Assert.assertTrue;
 import java.util.Date;
 
 import org.apache.hadoop.conf.Configuration;
-import org.junit.Test;
-
-import com.google.common.base.Optional;
-
 import org.apache.rya.api.instance.RyaDetails.EntityCentricIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.FreeTextIndexDetails;
-import org.apache.rya.api.instance.RyaDetails.GeoIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.FluoDetails;
@@ -44,6 +38,9 @@ import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails.PCJUpdateStrategy;
 import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
 import org.apache.rya.api.instance.RyaDetails.TemporalIndexDetails;
+import org.junit.Test;
+
+import com.google.common.base.Optional;
 
 public class RyaDetailsToConfigurationTest {
     @Test
@@ -53,7 +50,7 @@ public class RyaDetailsToConfigurationTest {
         builder.setRyaInstanceName("test_instance")
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(false) )
             .setPCJIndexDetails(
@@ -77,7 +74,7 @@ public class RyaDetailsToConfigurationTest {
         //defaults are set to cause the assert to fail
         assertTrue(conf.getBoolean(USE_ENTITY, false));
         assertFalse(conf.getBoolean(USE_FREETEXT, true));
-        assertTrue(conf.getBoolean(USE_GEO, false));
+      //RYA-215assertTrue(conf.getBoolean(USE_GEO, false));
         assertTrue(conf.getBoolean(USE_TEMPORAL, false));
         assertTrue(conf.getBoolean(USE_PCJ, false));
     }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsUpdaterTest.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsUpdaterTest.java b/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsUpdaterTest.java
index d2dc1a5..f4f6a87 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsUpdaterTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/instance/RyaDetailsUpdaterTest.java
@@ -28,13 +28,8 @@ import static org.mockito.Mockito.when;
 
 import java.util.Date;
 
-import org.junit.Test;
-
-import com.google.common.base.Optional;
-
 import org.apache.rya.api.instance.RyaDetails.EntityCentricIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.FreeTextIndexDetails;
-import org.apache.rya.api.instance.RyaDetails.GeoIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
@@ -44,6 +39,9 @@ import org.apache.rya.api.instance.RyaDetailsRepository.NotInitializedException;
 import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
 import org.apache.rya.api.instance.RyaDetailsUpdater.RyaDetailsMutator;
 import org.apache.rya.api.instance.RyaDetailsUpdater.RyaDetailsMutator.CouldNotApplyMutationException;
+import org.junit.Test;
+
+import com.google.common.base.Optional;
 
 /**
  * Tests the methods of {@link RyaDetailsUpdater}.
@@ -58,7 +56,7 @@ public class RyaDetailsUpdaterTest {
                 .setRyaVersion("0.0.0.0")
                 .setFreeTextDetails( new FreeTextIndexDetails(true) )
                 .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-                .setGeoIndexDetails( new GeoIndexDetails(true) )
+              //RYA-215                .setGeoIndexDetails( new GeoIndexDetails(true) )
                 .setTemporalIndexDetails( new TemporalIndexDetails(true) )
                 .setPCJIndexDetails(
                         PCJIndexDetails.builder()
@@ -95,7 +93,7 @@ public class RyaDetailsUpdaterTest {
                 .setRyaVersion("0.0.0.0")
                 .setFreeTextDetails( new FreeTextIndexDetails(true) )
                 .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-                .setGeoIndexDetails( new GeoIndexDetails(true) )
+              //RYA-215                .setGeoIndexDetails( new GeoIndexDetails(true) )
                 .setTemporalIndexDetails( new TemporalIndexDetails(true) )
                 .setPCJIndexDetails(
                         PCJIndexDetails.builder()

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/AccumuloRyaInstanceDetailsRepository.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/AccumuloRyaInstanceDetailsRepository.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/AccumuloRyaInstanceDetailsRepository.java
index c56bffc..be8e12c 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/AccumuloRyaInstanceDetailsRepository.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/AccumuloRyaInstanceDetailsRepository.java
@@ -1,6 +1,4 @@
-package org.apache.rya.accumulo.instance;
-
-/*
+/**
  * 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
@@ -9,7 +7,7 @@ package org.apache.rya.accumulo.instance;
  * "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
+ *     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
@@ -18,6 +16,7 @@ package org.apache.rya.accumulo.instance;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.accumulo.instance;
 
 import static java.util.Objects.requireNonNull;
 
@@ -46,7 +45,6 @@ import org.apache.accumulo.core.data.Mutation;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.io.Text;
-
 import org.apache.rya.api.instance.RyaDetails;
 import org.apache.rya.api.instance.RyaDetailsRepository;
 
@@ -86,7 +84,7 @@ public class AccumuloRyaInstanceDetailsRepository implements RyaDetailsRepositor
     public AccumuloRyaInstanceDetailsRepository(final Connector connector, final String instanceName) {
         this.connector = requireNonNull( connector );
         this.instanceName = requireNonNull( instanceName );
-        this.detailsTableName = instanceName + INSTANCE_DETAILS_TABLE_NAME;
+        detailsTableName = instanceName + INSTANCE_DETAILS_TABLE_NAME;
     }
 
     @Override
@@ -227,4 +225,15 @@ public class AccumuloRyaInstanceDetailsRepository implements RyaDetailsRepositor
             }
         }
     }
+
+    /**
+     * Make the Accumulo table name used by this repository for a specific instance of Rya.
+     *
+     * @param ryaInstanceName - The name of the Rya instance the table name is for. (not null)
+     * @return The Accumulo table name used by this repository for a specific instance of Rya.
+     */
+    public static String makeTableName(final String ryaInstanceName) {
+        requireNonNull(ryaInstanceName);
+        return ryaInstanceName + INSTANCE_DETAILS_TABLE_NAME;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/utils/TablePermissions.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/utils/TablePermissions.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/utils/TablePermissions.java
new file mode 100644
index 0000000..6700dee
--- /dev/null
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/utils/TablePermissions.java
@@ -0,0 +1,102 @@
+/**
+ * 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.accumulo.utils;
+
+import static java.util.Objects.requireNonNull;
+
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.admin.SecurityOperations;
+import org.apache.accumulo.core.security.TablePermission;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * A utility that makes it easier to grant and revoke table permissions within
+ * an instance of Accumulo.
+ */
+@DefaultAnnotation(NonNull.class)
+public class TablePermissions {
+
+    /**
+     * Grants the following Table Permissions for an Accumulo user to an Accumulo table.
+     * <ul>
+     *   <li>ALTER_TABLE</li>
+     *   <li>BULK_IMPORT</li>
+     *   <li>DROP_TABLE</li>
+     *   <li>GRANT</li>
+     *   <li>READ</li>
+     *   <li>WRITE</li>
+     * </ul>
+     *
+     * @param user - The user who will be granted the permissions. (not null)
+     * @param table - The Accumulo table the permissions are granted to. (not null)
+     * @param conn - The connector that is used to access the Accumulo instance
+     *   that hosts the the {@code user} and {@code table}. (not null)
+     * @throws AccumuloSecurityException If a general error occurs.
+     * @throws AccumuloException If the user does not have permission to grant a user permissions.
+     */
+    public void grantAllPermissions(final String user, final String table, final Connector conn) throws AccumuloException, AccumuloSecurityException {
+        requireNonNull(user);
+        requireNonNull(table);
+        requireNonNull(conn);
+
+        final SecurityOperations secOps = conn.securityOperations();
+        secOps.grantTablePermission(user, table, TablePermission.ALTER_TABLE);
+        secOps.grantTablePermission(user, table, TablePermission.BULK_IMPORT);
+        secOps.grantTablePermission(user, table, TablePermission.DROP_TABLE);
+        secOps.grantTablePermission(user, table, TablePermission.GRANT);
+        secOps.grantTablePermission(user, table, TablePermission.READ);
+        secOps.grantTablePermission(user, table, TablePermission.WRITE);
+    }
+
+    /**
+     * Revokes the following Table Permissions for an Accumulo user from an Accumulo table.
+     * <ul>
+     *   <li>ALTER_TABLE</li>
+     *   <li>BULK_IMPORT</li>
+     *   <li>DROP_TABLE</li>
+     *   <li>GRANT</li>
+     *   <li>READ</li>
+     *   <li>WRITE</li>
+     * </ul>
+     *
+     * @param user - The user whose permissions will be revoked. (not null)
+     * @param table - The Accumulo table the permissions are revoked from. (not null)
+     * @param conn - The connector that is used to access the Accumulo instance
+     *   that hosts the the {@code user} and {@code table}. (not null)
+     * @throws AccumuloException If a general error occurs.
+     * @throws AccumuloSecurityException If the user does not have permission to revoke a user's permissions.
+     */
+    public void revokeAllPermissions(final String user, final String table, final Connector conn) throws AccumuloException, AccumuloSecurityException {
+        requireNonNull(user);
+        requireNonNull(table);
+        requireNonNull(conn);
+
+        final SecurityOperations secOps = conn.securityOperations();
+        secOps.revokeTablePermission(user, table, TablePermission.ALTER_TABLE);
+        secOps.revokeTablePermission(user, table, TablePermission.BULK_IMPORT);
+        secOps.revokeTablePermission(user, table, TablePermission.DROP_TABLE);
+        secOps.revokeTablePermission(user, table, TablePermission.GRANT);
+        secOps.revokeTablePermission(user, table, TablePermission.READ);
+        secOps.revokeTablePermission(user, table, TablePermission.WRITE);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaITBase.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaITBase.java b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaITBase.java
index a4ef7d7..a832c32 100644
--- a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaITBase.java
+++ b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaITBase.java
@@ -76,7 +76,7 @@ public class AccumuloRyaITBase {
                 .setRyaVersion("0.0.0.0")
                 .setFreeTextDetails( new FreeTextIndexDetails(true) )
                 .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-                .setGeoIndexDetails( new GeoIndexDetails(true) )
+              //RYA-215                .setGeoIndexDetails( new GeoIndexDetails(true) )
                 .setTemporalIndexDetails( new TemporalIndexDetails(true) )
                 .setPCJIndexDetails(
                         PCJIndexDetails.builder()

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/MiniAccumuloClusterInstance.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/MiniAccumuloClusterInstance.java b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/MiniAccumuloClusterInstance.java
index 2552ef5..75ab792 100644
--- a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/MiniAccumuloClusterInstance.java
+++ b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/MiniAccumuloClusterInstance.java
@@ -83,7 +83,7 @@ public class MiniAccumuloClusterInstance {
     }
 
     /**
-     * @return An accumulo connector that is connected to the mini cluster.
+     * @return An Accumulo connector that is connected to the mini cluster's root account.
      */
     public Connector getConnector() throws AccumuloException, AccumuloSecurityException {
         return cluster.getConnector(USERNAME, PASSWORD);

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/instance/AccumuloRyaDetailsRepositoryIT.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/instance/AccumuloRyaDetailsRepositoryIT.java b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/instance/AccumuloRyaDetailsRepositoryIT.java
index 67e2696..50783af 100644
--- a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/instance/AccumuloRyaDetailsRepositoryIT.java
+++ b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/instance/AccumuloRyaDetailsRepositoryIT.java
@@ -22,35 +22,17 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
 import java.util.Date;
 
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.Instance;
-import org.apache.accumulo.core.client.ZooKeeperInstance;
-import org.apache.accumulo.core.client.mock.MockInstance;
-import org.apache.accumulo.core.client.security.tokens.PasswordToken;
 import org.apache.accumulo.minicluster.MiniAccumuloCluster;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.zookeeper.ClientCnxn;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import com.google.common.base.Optional;
-
 import org.apache.rya.accumulo.AccumuloITBase;
 import org.apache.rya.accumulo.MiniAccumuloClusterInstance;
 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.GeoIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.FluoDetails;
@@ -63,6 +45,9 @@ import org.apache.rya.api.instance.RyaDetailsRepository.AlreadyInitializedExcept
 import org.apache.rya.api.instance.RyaDetailsRepository.ConcurrentUpdateException;
 import org.apache.rya.api.instance.RyaDetailsRepository.NotInitializedException;
 import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
+import org.junit.Test;
+
+import com.google.common.base.Optional;
 
 /**
  * Tests the methods of {@link AccumuloRyaDetailsRepository} by using a {@link MiniAccumuloCluster}.
@@ -78,7 +63,7 @@ public class AccumuloRyaDetailsRepositoryIT extends AccumuloITBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -120,7 +105,7 @@ public class AccumuloRyaDetailsRepositoryIT extends AccumuloITBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -169,7 +154,7 @@ public class AccumuloRyaDetailsRepositoryIT extends AccumuloITBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -219,7 +204,7 @@ public class AccumuloRyaDetailsRepositoryIT extends AccumuloITBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -247,7 +232,7 @@ public class AccumuloRyaDetailsRepositoryIT extends AccumuloITBase {
 
         // Create a new state for the details.
         final RyaDetails updated = new RyaDetails.Builder( details )
-                .setGeoIndexDetails( new GeoIndexDetails(false) )
+                .setEntityCentricIndexDetails(new EntityCentricIndexDetails(false) )
                 .build();
 
         // Execute the update.
@@ -267,7 +252,7 @@ public class AccumuloRyaDetailsRepositoryIT extends AccumuloITBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -295,7 +280,7 @@ public class AccumuloRyaDetailsRepositoryIT extends AccumuloITBase {
 
         // Create a new state for the details.
         final RyaDetails updated = new RyaDetails.Builder( details )
-                .setGeoIndexDetails( new GeoIndexDetails(false) )
+                .setEntityCentricIndexDetails(new EntityCentricIndexDetails(false) )
                 .build();
 
         // Try to execute the update where the old state is not the currently stored state.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/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 39b05eb..d11af76 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
@@ -23,22 +23,13 @@ import static java.util.Objects.requireNonNull;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Map.Entry;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.mongodb.BasicDBList;
-import com.mongodb.BasicDBObject;
-import com.mongodb.BasicDBObjectBuilder;
-import com.mongodb.DBObject;
-
 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.GeoIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.FluoDetails;
@@ -47,6 +38,13 @@ import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails.PCJUpda
 import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
 import org.apache.rya.api.instance.RyaDetails.TemporalIndexDetails;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.mongodb.BasicDBList;
+import com.mongodb.BasicDBObject;
+import com.mongodb.BasicDBObjectBuilder;
+import com.mongodb.DBObject;
+
 /**
  * Serializes configuration details for use in Mongo.
  * The {@link DBObject} will look like:
@@ -105,7 +103,7 @@ public class MongoDetailsAdapter {
             .add(INSTANCE_KEY, details.getRyaInstanceName())
             .add(VERSION_KEY, details.getRyaVersion())
             .add(ENTITY_DETAILS_KEY, details.getEntityCentricIndexDetails().isEnabled())
-            .add(GEO_DETAILS_KEY, details.getGeoIndexDetails().isEnabled())
+          //RYA-215            .add(GEO_DETAILS_KEY, details.getGeoIndexDetails().isEnabled())
             .add(PCJ_DETAILS_KEY, toDBObject(details.getPCJIndexDetails()))
             .add(TEMPORAL_DETAILS_KEY, details.getTemporalIndexDetails().isEnabled())
             .add(FREETEXT_DETAILS_KEY, details.getFreeTextIndexDetails().isEnabled());
@@ -169,7 +167,7 @@ public class MongoDetailsAdapter {
             .setRyaInstanceName(basicObj.getString(INSTANCE_KEY))
             .setRyaVersion(basicObj.getString(VERSION_KEY))
             .setEntityCentricIndexDetails(new EntityCentricIndexDetails(basicObj.getBoolean(ENTITY_DETAILS_KEY)))
-            .setGeoIndexDetails(new GeoIndexDetails(basicObj.getBoolean(GEO_DETAILS_KEY)))
+          //RYA-215            .setGeoIndexDetails(new GeoIndexDetails(basicObj.getBoolean(GEO_DETAILS_KEY)))
             .setPCJIndexDetails(getPCJIndexDetails(basicObj))
             .setTemporalIndexDetails(new TemporalIndexDetails(basicObj.getBoolean(TEMPORAL_DETAILS_KEY)))
             .setFreeTextDetails(new FreeTextIndexDetails(basicObj.getBoolean(FREETEXT_DETAILS_KEY)))

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoDetailsAdapterTest.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoDetailsAdapterTest.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoDetailsAdapterTest.java
index 2809080..533e2df 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoDetailsAdapterTest.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoDetailsAdapterTest.java
@@ -23,17 +23,9 @@ import static org.junit.Assert.assertEquals;
 
 import java.util.Date;
 
-import org.junit.Test;
-
-import com.google.common.base.Optional;
-import com.mongodb.BasicDBObject;
-import com.mongodb.DBObject;
-import com.mongodb.util.JSON;
-
 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.GeoIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.FluoDetails;
@@ -42,6 +34,12 @@ import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails.PCJUpda
 import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
 import org.apache.rya.api.instance.RyaDetails.TemporalIndexDetails;
 import org.apache.rya.mongodb.instance.MongoDetailsAdapter.MalformedRyaDetailsException;
+import org.junit.Test;
+
+import com.google.common.base.Optional;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBObject;
+import com.mongodb.util.JSON;
 
 /**
  * Tests the methods of {@link MongoDetailsAdapter}.
@@ -55,7 +53,7 @@ public class MongoDetailsAdapterTest {
             .setRyaInstanceName("test")
             .setRyaVersion("1")
             .setEntityCentricIndexDetails(new EntityCentricIndexDetails(true))
-            .setGeoIndexDetails(new GeoIndexDetails(true))
+          //RYA-215            .setGeoIndexDetails(new GeoIndexDetails(true))
             .setPCJIndexDetails(
                 PCJIndexDetails.builder()
                 .setEnabled(true)
@@ -84,7 +82,7 @@ public class MongoDetailsAdapterTest {
             + "instanceName : \"test\","
             + "version : \"1\","
             + "entityCentricDetails : true,"
-            + "geoDetails : true,"
+          //RYA-215            + "geoDetails : true,"
             + "pcjDetails : {"
             +    "enabled : true ,"
             +    "fluoName : \"fluo\","
@@ -118,7 +116,7 @@ public class MongoDetailsAdapterTest {
             + "instanceName : \"test\","
             + "version : \"1\","
             + "entityCentricDetails : true,"
-            + "geoDetails : true,"
+          //RYA-215            + "geoDetails : true,"
             + "pcjDetails : {"
             +    "enabled : true ,"
             +    "fluoName : \"fluo\","
@@ -148,7 +146,7 @@ public class MongoDetailsAdapterTest {
             .setRyaInstanceName("test")
             .setRyaVersion("1")
             .setEntityCentricIndexDetails(new EntityCentricIndexDetails(true))
-            .setGeoIndexDetails(new GeoIndexDetails(true))
+          //RYA-215            .setGeoIndexDetails(new GeoIndexDetails(true))
             .setPCJIndexDetails(
                 PCJIndexDetails.builder()
                     .setEnabled(true)
@@ -180,7 +178,7 @@ public class MongoDetailsAdapterTest {
                 + "instanceName : \"test\","
                 + "version : \"1\","
                 + "entityCentricDetails : true,"
-                + "geoDetails : false,"
+              //RYA-215                + "geoDetails : false,"
                 + "pcjDetails : {"
                 +    "enabled : false,"
                 +    "fluoName : \"fluo\","
@@ -203,7 +201,7 @@ public class MongoDetailsAdapterTest {
             .setRyaInstanceName("test")
             .setRyaVersion("1")
             .setEntityCentricIndexDetails(new EntityCentricIndexDetails(true))
-            .setGeoIndexDetails(new GeoIndexDetails(false))
+          //RYA-215            .setGeoIndexDetails(new GeoIndexDetails(false))
             .setPCJIndexDetails(
                     PCJIndexDetails.builder()
                     .setEnabled(false)
@@ -228,7 +226,7 @@ public class MongoDetailsAdapterTest {
             .setRyaInstanceName("test")
             .setRyaVersion("1")
             .setEntityCentricIndexDetails(new EntityCentricIndexDetails(true))
-            .setGeoIndexDetails(new GeoIndexDetails(false))
+          //RYA-215            .setGeoIndexDetails(new GeoIndexDetails(false))
             .setPCJIndexDetails(
                 PCJIndexDetails.builder()
                     .setEnabled(true)
@@ -247,7 +245,7 @@ public class MongoDetailsAdapterTest {
                 + "instanceName : \"test\","
                 + "version : \"1\","
                 + "entityCentricDetails : true,"
-                + "geoDetails : false,"
+              //RYA-215                + "geoDetails : false,"
                 + "pcjDetails : {"
                 +    "enabled : true,"
                 +    "fluoName : \"fluo\","

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java
index 86a8965..8d1694b 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java
@@ -23,12 +23,12 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.io.IOException;
 import java.util.Date;
 
 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.GeoIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.FluoDetails;
@@ -41,16 +41,39 @@ import org.apache.rya.api.instance.RyaDetailsRepository.AlreadyInitializedExcept
 import org.apache.rya.api.instance.RyaDetailsRepository.ConcurrentUpdateException;
 import org.apache.rya.api.instance.RyaDetailsRepository.NotInitializedException;
 import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
-import org.apache.rya.mongodb.MongoRyaTestBase;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.google.common.base.Optional;
+import com.mongodb.MongoClient;
+import com.mongodb.MongoException;
+
+import de.flapdoodle.embed.mongo.tests.MongodForTestsFactory;
 
 /**
  * Tests the methods of {@link AccumuloRyaDetailsRepository} by using a {@link MiniAccumuloCluster}.
  */
-public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
+public class MongoRyaDetailsRepositoryIT {
+
+    private static MongoClient client = null;
+
+    @BeforeClass
+    public static void startMiniAccumulo() throws MongoException, IOException {
+        final MongodForTestsFactory mongoFactory = new MongodForTestsFactory();
+        client = mongoFactory.newMongo();
+    }
 
+    @Before
+    public void clearLastTest() {
+        client.dropDatabase("testInstance");
+    }
+
+    @AfterClass
+    public static void stopMiniAccumulo() throws IOException, InterruptedException {
+        client.close();
+    }
 
     @Test
     public void initializeAndGet() throws AlreadyInitializedException, RyaDetailsRepositoryException {
@@ -61,7 +84,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -81,7 +104,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .build();
 
         // Setup the repository that will be tested using a mock instance of MongoDB.
-        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(mongoClient, instanceName);
+        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(client, instanceName);
 
         // Initialize the repository
         repo.initialize(details);
@@ -102,7 +125,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -122,7 +145,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .build();
 
         // Setup the repository that will be tested using a mock instance of MongoDB.
-        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(mongoClient, instanceName);
+        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(client, instanceName);
 
         // Initialize the repository
         repo.initialize(details);
@@ -134,7 +157,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
     @Test(expected = NotInitializedException.class)
     public void getRyaInstance_notInitialized() throws NotInitializedException, RyaDetailsRepositoryException {
         // Setup the repository that will be tested using a mock instance of Accumulo.
-        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(mongoClient, "testInstance");
+        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(client, "testInstance");
 
         // Try to fetch the details from the uninitialized repository.
         repo.getRyaInstanceDetails();
@@ -149,7 +172,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -169,7 +192,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .build();
 
         // Setup the repository that will be tested using a mock instance of MongoDB.
-        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(mongoClient, "testInstance");
+        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(client, "testInstance");
 
         // Initialize the repository
         repo.initialize(details);
@@ -181,7 +204,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
     @Test
     public void isInitialized_false() throws RyaDetailsRepositoryException {
         // Setup the repository that will be tested using a mock instance of MongoDB.
-        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(mongoClient, "testInstance");
+        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(client, "testInstance");
 
         // Ensure the repository reports that is has not been initialized.
         assertFalse( repo.isInitialized() );
@@ -196,7 +219,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -216,14 +239,14 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .build();
 
         // Setup the repository that will be tested using a mock instance of MongoDB.
-        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(mongoClient, "testInstance");
+        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(client, "testInstance");
 
         // Initialize the repository
         repo.initialize(details);
 
         // Create a new state for the details.
         final RyaDetails updated = new RyaDetails.Builder( details )
-                .setGeoIndexDetails( new GeoIndexDetails(false) )
+                .setEntityCentricIndexDetails(new EntityCentricIndexDetails(false) )
                 .build();
 
         // Execute the update.
@@ -243,7 +266,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .setRyaInstanceName(instanceName)
             .setRyaVersion("1.2.3.4")
             .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )
-            .setGeoIndexDetails( new GeoIndexDetails(true) )
+          //RYA-215            .setGeoIndexDetails( new GeoIndexDetails(true) )
             .setTemporalIndexDetails( new TemporalIndexDetails(true) )
             .setFreeTextDetails( new FreeTextIndexDetails(true) )
             .setPCJIndexDetails(
@@ -263,7 +286,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
             .build();
 
         // Setup the repository that will be tested using a mock instance of MongoDB.
-        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(mongoClient, "testInstance");
+        final RyaDetailsRepository repo = new MongoRyaInstanceDetailsRepository(client, "testInstance");
 
         // Initialize the repository
         repo.initialize(details);
@@ -274,7 +297,7 @@ public class MongoRyaDetailsRepositoryIT extends MongoRyaTestBase {
                 .build();
 
         final RyaDetails updated = new RyaDetails.Builder( details )
-                .setGeoIndexDetails( new GeoIndexDetails(false) )
+                .setEntityCentricIndexDetails(new EntityCentricIndexDetails(false) )
                 .build();
 
         // Try to execute the update where the old state is not the currently stored state.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/main/java/org/apache/rya/accumulo/utils/RyaTableNames.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/accumulo/utils/RyaTableNames.java b/extras/indexing/src/main/java/org/apache/rya/accumulo/utils/RyaTableNames.java
new file mode 100644
index 0000000..faeebbb
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/accumulo/utils/RyaTableNames.java
@@ -0,0 +1,117 @@
+/*
+ * 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.accumulo.utils;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.admin.TableOperations;
+import org.apache.rya.accumulo.instance.AccumuloRyaInstanceDetailsRepository;
+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.api.layout.TableLayoutStrategy;
+import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
+import org.apache.rya.indexing.accumulo.entity.EntityCentricIndex;
+import org.apache.rya.indexing.accumulo.freetext.AccumuloFreeTextIndexer;
+import org.apache.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;
+import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
+import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
+import org.apache.rya.indexing.pcj.storage.accumulo.PcjTableNameFactory;
+
+/**
+ * A utility that may be used to determine which Accumulo tables are part of  a Rya instance.
+ */
+public class RyaTableNames {
+
+    /**
+     * Get the the Accumulo table names that are used by an instance of Rya.
+     *
+     * @param ryaInstanceName - The name of the Rya instance. (not null)
+     * @param conn - A connector to the host Accumulo instance. (not null)
+     * @return The Accumulo table names that are used by the Rya instance.
+     * @throws NotInitializedException The instance's Rya Details have not been initialized.
+     * @throws RyaDetailsRepositoryException General problem with the Rya Details repository.
+     * @throws PCJStorageException General problem with the PCJ storage.
+     */
+    public List<String> getTableNames(final String ryaInstanceName, final Connector conn) throws NotInitializedException, RyaDetailsRepositoryException, PCJStorageException {
+        // Build the list of tables that may be present within the Rya instance.
+        final List<String> tables = new ArrayList<>();
+
+        // Core Rya tables.
+        final TableLayoutStrategy coreTableNames = new TablePrefixLayoutStrategy(ryaInstanceName);
+        tables.add( coreTableNames.getSpo() );
+        tables.add( coreTableNames.getPo() );
+        tables.add( coreTableNames.getOsp() );
+        tables.add( coreTableNames.getEval() );
+        tables.add( coreTableNames.getNs() );
+        tables.add( coreTableNames.getProspects() );
+        tables.add( coreTableNames.getSelectivity() );
+
+        // Rya Details table.
+        tables.add( AccumuloRyaInstanceDetailsRepository.makeTableName(ryaInstanceName) );
+
+        // Secondary Indexer Tables.
+        final RyaDetailsRepository detailsRepo = new AccumuloRyaInstanceDetailsRepository(conn, ryaInstanceName);
+        final RyaDetails details = detailsRepo.getRyaInstanceDetails();
+
+        if(details.getEntityCentricIndexDetails().isEnabled()) {
+            tables.add( EntityCentricIndex.makeTableName(ryaInstanceName) );
+        }
+
+        if(details.getFreeTextIndexDetails().isEnabled()) {
+            tables.addAll( AccumuloFreeTextIndexer.makeTableNames(ryaInstanceName) );
+        }
+
+        if(details.getTemporalIndexDetails().isEnabled()) {
+            tables.add( AccumuloTemporalIndexer.makeTableName(ryaInstanceName) );
+        }
+
+/**
+ *         if(details.getGeoIndexDetails().isEnabled()) {
+ *             tables.add( GeoMesaGeoIndexer.makeTableName(ryaInstanceName) );
+ *         }
+ */
+
+        if(details.getPCJIndexDetails().isEnabled()) {
+            final List<String> pcjIds = new AccumuloPcjStorage(conn, ryaInstanceName).listPcjs();
+
+            final PcjTableNameFactory tableNameFactory = new PcjTableNameFactory();
+            for(final String pcjId : pcjIds) {
+                tables.add( tableNameFactory.makeTableName(ryaInstanceName, pcjId) );
+            }
+        }
+
+        // Verify they actually exist. If any don't, remove them from the list.
+        final TableOperations tableOps = conn.tableOperations();
+
+        final Iterator<String> tablesIt = tables.iterator();
+        while(tablesIt.hasNext()) {
+            final String table = tablesIt.next();
+            if(!tableOps.exists(table)) {
+                tablesIt.remove();
+            }
+        }
+
+        return tables;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloAddUser.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloAddUser.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloAddUser.java
new file mode 100644
index 0000000..6590d2c
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloAddUser.java
@@ -0,0 +1,106 @@
+/*
+ * 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.util.List;
+
+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.accumulo.instance.AccumuloRyaInstanceDetailsRepository;
+import org.apache.rya.accumulo.utils.RyaTableNames;
+import org.apache.rya.accumulo.utils.TablePermissions;
+import org.apache.rya.api.client.AddUser;
+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.RyaDetailsRepository.RyaDetailsRepositoryException;
+import org.apache.rya.api.instance.RyaDetailsUpdater;
+import org.apache.rya.api.instance.RyaDetailsUpdater.RyaDetailsMutator.CouldNotApplyMutationException;
+import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * An Accumulo implementation of the {@link AddUser} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class AccumuloAddUser extends AccumuloCommand implements AddUser {
+
+    private static final TablePermissions TABLE_PERMISSIONS = new TablePermissions();
+
+    /**
+     * Constructs an instance of {@link AccumuloAddUser}.
+     *
+     * @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 AccumuloAddUser(
+            final AccumuloConnectionDetails connectionDetails,
+            final Connector connector) {
+        super(connectionDetails, connector);
+    }
+
+    @Override
+    public void addUser(final String instanceName, final String username) throws InstanceDoesNotExistException, RyaClientException {
+        requireNonNull(instanceName);
+        requireNonNull(username);
+
+        // If the user has already been added, then return immediately.
+        try {
+            final RyaDetails details = new AccumuloRyaInstanceDetailsRepository(getConnector(), instanceName).getRyaInstanceDetails();
+            final List<String> users = details.getUsers();
+            if(users.contains(username)) {
+                return;
+            }
+        } catch (final RyaDetailsRepositoryException e) {
+            throw new RyaClientException("Could not fetch the RyaDetails for Rya instance named '" + instanceName + ".", e);
+        }
+
+        // Update the instance details
+        final RyaDetailsUpdater updater = new RyaDetailsUpdater( new AccumuloRyaInstanceDetailsRepository(getConnector(), instanceName) );
+        try {
+            updater.update(originalDetails -> RyaDetails.builder( originalDetails ).addUser(username).build());
+        } catch (RyaDetailsRepositoryException | CouldNotApplyMutationException e) {
+            throw new RyaClientException("Could not add the user '" + username + "' to the Rya instance's details.", e);
+        }
+
+        // Grant all access to all the instance's tables.
+        try {
+            // Build the list of tables that are present within the Rya instance.
+            final List<String> tables = new RyaTableNames().getTableNames(instanceName, getConnector());
+
+            // Update the user permissions for those tables.
+            for(final String table : tables) {
+                try {
+                    TABLE_PERMISSIONS.grantAllPermissions(username, table, getConnector());
+                } catch (AccumuloException | AccumuloSecurityException e) {
+                    throw new RyaClientException("Could not grant access to table '" + table + "' for user '" + username + "'.", e);
+                }
+            }
+        } catch (PCJStorageException | RyaDetailsRepositoryException e) {
+            throw new RyaClientException("Could not determine which tables exist for the '" + instanceName + "' instance of Rya.", e);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCommand.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCommand.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCommand.java
index 0691bb5..56620df 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCommand.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCommand.java
@@ -38,8 +38,9 @@ public abstract class AccumuloCommand {
     /**
      * Constructs an instance of {@link AccumuloCommand}.
      *
-     * 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 Accumulo
+     * @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 AccumuloCommand(

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/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 c4ba8b4..1849fd8 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
@@ -28,11 +28,6 @@ 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;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
-
-import com.google.common.base.Optional;
-
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.instance.AccumuloRyaInstanceDetailsRepository;
 import org.apache.rya.api.client.Install;
@@ -41,7 +36,6 @@ 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.GeoIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.JoinSelectivityDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.FluoDetails;
@@ -56,6 +50,10 @@ import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.Precomputed
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinUpdaterType;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.openrdf.sail.Sail;
+import org.openrdf.sail.SailException;
+
+import com.google.common.base.Optional;
 
 /**
  * An Accumulo implementation of the {@link Install} command.
@@ -91,7 +89,7 @@ public class AccumuloInstall extends AccumuloCommand implements Install {
         // Initialize the Rya Details table.
         RyaDetails details;
         try {
-            details = initializeRyaDetails(instanceName, installConfig);
+            details = initializeRyaDetails(instanceName, installConfig, getConnector().whoami());
         } 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 " +
@@ -125,14 +123,19 @@ public class AccumuloInstall extends AccumuloCommand implements Install {
      *
      * @param instanceName - The name of the instance that is being created. (not null)
      * @param installConfig - The instance's install configuration. (not null)
+     * @param installUser - The user who is installing the instance of Rya. (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)
+    private RyaDetails initializeRyaDetails(final String instanceName, final InstallConfiguration installConfig, final String installUser)
             throws AlreadyInitializedException, RyaDetailsRepositoryException {
+        requireNonNull(instanceName);
+        requireNonNull(installConfig);
+        requireNonNull(installUser);
+
         final RyaDetailsRepository detailsRepo = new AccumuloRyaInstanceDetailsRepository(getConnector(), instanceName);
 
         // Build the PCJ Index details.
@@ -147,10 +150,10 @@ public class AccumuloInstall extends AccumuloCommand implements Install {
                 // General Metadata
                 .setRyaInstanceName(instanceName)
                 .setRyaVersion( getVersion() )
+                .addUser(installUser)
 
                 // Secondary Index Values
-                .setGeoIndexDetails(
-                        new GeoIndexDetails(installConfig.isGeoIndexEnabled()))
+              //RYA-215                .setGeoIndexDetails(new GeoIndexDetails(installConfig.isGeoIndexEnabled()))
                 .setTemporalIndexDetails(
                         new TemporalIndexDetails(installConfig.isTemporalIndexEnabled()))
                 .setFreeTextDetails(
@@ -187,8 +190,10 @@ public class AccumuloInstall extends AccumuloCommand implements Install {
         conf.setTablePrefix( details.getRyaInstanceName() );
 
         // Enable the indexers that the instance is configured to use.
-        // TODO fix me, not sure why the install command is here.
-//        conf.set(ConfigUtils.USE_GEO, "" + details.getGeoIndexDetails().isEnabled() );
+        /**
+         * RYA-215
+         * conf.set(ConfigUtils.USE_GEO, "" + details.getGeoIndexDetails().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());