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:04 UTC

[2/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

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUser.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUser.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUser.java
new file mode 100644
index 0000000..764e002
--- /dev/null
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUser.java
@@ -0,0 +1,95 @@
+/*
+ * 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.InstanceDoesNotExistException;
+import org.apache.rya.api.client.RemoveUser;
+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 DeleteUser} command.
+ */
+@DefaultAnnotation(NonNull.class)
+public class AccumuloRemoveUser extends AccumuloCommand implements RemoveUser {
+
+    private static final TablePermissions TABLE_PERMISSIONS = new TablePermissions();
+
+    /**
+     * Constructs an instance of {@link AccumuloDeleteUser}.
+     *
+     * @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 AccumuloRemoveUser(
+            final AccumuloConnectionDetails connectionDetails,
+            final Connector connector) {
+        super(connectionDetails, connector);
+    }
+
+    @Override
+    public void removeUser(final String instanceName, final String username) throws InstanceDoesNotExistException, RyaClientException {
+        requireNonNull(instanceName);
+        requireNonNull(username);
+
+        // Update the instance details.
+        final RyaDetailsUpdater updater = new RyaDetailsUpdater( new AccumuloRyaInstanceDetailsRepository(getConnector(), instanceName) );
+        try {
+            updater.update(originalDetails -> RyaDetails.builder( originalDetails ).removeUser(username).build());
+        } catch (RyaDetailsRepositoryException | CouldNotApplyMutationException e) {
+            throw new RyaClientException("Could not remove the user '" + username + "' from the Rya instance's details.", e);
+        }
+
+        // Revoke 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.revokeAllPermissions(username, table, getConnector());
+                } catch (AccumuloException | AccumuloSecurityException e) {
+                    throw new RyaClientException("Could not revoke access to table '" + table + "' from 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/AccumuloRyaClientFactory.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java
index e0fd25f..02c461f 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloRyaClientFactory.java
@@ -24,7 +24,6 @@ import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
 
 import org.apache.accumulo.core.client.Connector;
-
 import org.apache.rya.api.client.RyaClient;
 
 /**
@@ -56,6 +55,8 @@ public class AccumuloRyaClientFactory {
                 new AccumuloBatchUpdatePCJ(connectionDetails, connector),
                 new AccumuloGetInstanceDetails(connectionDetails, connector),
                 new AccumuloInstanceExists(connectionDetails, connector),
-                new AccumuloListInstances(connectionDetails, connector));
+                new AccumuloListInstances(connectionDetails, connector),
+                new AccumuloAddUser(connectionDetails, connector),
+                new AccumuloRemoveUser(connectionDetails, connector));
     }
 }
\ 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/indexing/accumulo/entity/EntityCentricIndex.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndex.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndex.java
index c9f432e..2a2bde3 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndex.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndex.java
@@ -1,5 +1,3 @@
-package org.apache.rya.indexing.accumulo.entity;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,8 +16,9 @@ package org.apache.rya.indexing.accumulo.entity;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.accumulo.entity;
 
-
+import static java.util.Objects.requireNonNull;
 import static org.apache.rya.accumulo.AccumuloRdfConstants.EMPTY_CV;
 import static org.apache.rya.accumulo.AccumuloRdfConstants.EMPTY_VALUE;
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.DELIM_BYTES;
@@ -47,12 +46,6 @@ import org.apache.accumulo.core.security.ColumnVisibility;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
 import org.apache.log4j.Logger;
-import org.openrdf.model.URI;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Bytes;
-
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.experimental.AbstractAccumuloIndexer;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
@@ -63,6 +56,11 @@ import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.openrdf.model.URI;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Bytes;
 
 public class EntityCentricIndex extends AbstractAccumuloIndexer {
 
@@ -83,7 +81,7 @@ public class EntityCentricIndex extends AbstractAccumuloIndexer {
         return conf;
     }
 
-  //initialization occurs in setConf because index is created using reflection
+    //initialization occurs in setConf because index is created using reflection
     @Override
     public void setConf(final Configuration conf) {
         if (conf instanceof AccumuloRdfConfiguration) {
@@ -115,23 +113,37 @@ public class EntityCentricIndex extends AbstractAccumuloIndexer {
     }
 
     /**
-     * Get the Accumulo table used by this index.  
+     * Get the Accumulo table used by this index.
      * @return table used by instances of this index
      */
     @Override
     public String getTableName() {
         return getTableName(conf);
     }
-    
+
     /**
-     * Get the Accumulo table that will be used by this index.  
-     * @param conf
+     * Get the Accumulo table that will be used by this index.
+     *
+     * @param conf - The Rya configuration that specifies which instance of Rya
+     *   the table name will be built for. (not null)
      * @return table name guaranteed to be used by instances of this index
      */
-    public static String getTableName(Configuration conf) {
+    public static String getTableName(final Configuration conf) {
+        requireNonNull(conf);
         return ConfigUtils.getTablePrefix(conf)  + TABLE_SUFFIX;
     }
 
+    /**
+     * Make the Accumulo table name used by this indexer 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 indexer for a specific instance of Rya.
+     */
+    public static String makeTableName(final String ryaInstanceName) {
+        requireNonNull(ryaInstanceName);
+        return ryaInstanceName + TABLE_SUFFIX;
+    }
+
     @Override
     public void setMultiTableBatchWriter(final MultiTableBatchWriter writer) throws IOException {
         try {
@@ -253,28 +265,28 @@ public class EntityCentricIndex extends AbstractAccumuloIndexer {
      * @throws IOException if edge direction can't be extracted as expected.
      * @throws RyaTypeResolverException if a type error occurs deserializing the statement's object.
      */
-    public static RyaStatement deserializeStatement(Key key, Value value) throws RyaTypeResolverException, IOException {
+    public static RyaStatement deserializeStatement(final Key key, final Value value) throws RyaTypeResolverException, IOException {
         assert key != null;
         assert value != null;
-        byte[] entityBytes = key.getRowData().toArray();
-        byte[] predicateBytes = key.getColumnFamilyData().toArray();
-        byte[] data = key.getColumnQualifierData().toArray();
-        long timestamp = key.getTimestamp();
-        byte[] columnVisibility = key.getColumnVisibilityData().toArray();
-        byte[] valueBytes = value.get();
+        final byte[] entityBytes = key.getRowData().toArray();
+        final byte[] predicateBytes = key.getColumnFamilyData().toArray();
+        final byte[] data = key.getColumnQualifierData().toArray();
+        final long timestamp = key.getTimestamp();
+        final byte[] columnVisibility = key.getColumnVisibilityData().toArray();
+        final byte[] valueBytes = value.get();
 
         // main entity is either the subject or object
         // data contains: column family , var name of other node , data of other node + datatype of object
         int split = Bytes.indexOf(data, DELIM_BYTES);
-        byte[] columnFamily = Arrays.copyOf(data, split);
-        byte[] edgeBytes = Arrays.copyOfRange(data, split + DELIM_BYTES.length, data.length);
+        final byte[] columnFamily = Arrays.copyOf(data, split);
+        final byte[] edgeBytes = Arrays.copyOfRange(data, split + DELIM_BYTES.length, data.length);
         split = Bytes.indexOf(edgeBytes, DELIM_BYTES);
-        String otherNodeVar = new String(Arrays.copyOf(edgeBytes, split));
-        byte[] otherNodeBytes = Arrays.copyOfRange(edgeBytes,  split + DELIM_BYTES.length, edgeBytes.length - 2);
-        byte[] typeBytes = Arrays.copyOfRange(edgeBytes,  edgeBytes.length - 2, edgeBytes.length);
+        final String otherNodeVar = new String(Arrays.copyOf(edgeBytes, split));
+        final byte[] otherNodeBytes = Arrays.copyOfRange(edgeBytes,  split + DELIM_BYTES.length, edgeBytes.length - 2);
+        final byte[] typeBytes = Arrays.copyOfRange(edgeBytes,  edgeBytes.length - 2, edgeBytes.length);
         byte[] objectBytes;
         RyaURI subject;
-        RyaURI predicate = new RyaURI(new String(predicateBytes));
+        final RyaURI predicate = new RyaURI(new String(predicateBytes));
         RyaType object;
         RyaURI context = null;
         // Expect either: entity=subject.data, otherNodeVar="object", otherNodeBytes={object.data, object.datatype_marker}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java
index 7d0006a..8c07a8c 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java
@@ -1,5 +1,3 @@
-package org.apache.rya.indexing.accumulo.freetext;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -8,9 +6,9 @@ package org.apache.rya.indexing.accumulo.freetext;
  * 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
@@ -18,15 +16,14 @@ package org.apache.rya.indexing.accumulo.freetext;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.accumulo.freetext;
 
-
-
+import static java.util.Objects.requireNonNull;
 import static org.apache.rya.indexing.accumulo.freetext.query.ASTNodeUtils.getNodeIterator;
 
 import java.io.IOException;
 import java.nio.charset.CharacterCodingException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -58,14 +55,6 @@ import org.apache.commons.lang.Validate;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
 import org.apache.log4j.Logger;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
-
-import com.google.common.base.Charsets;
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.accumulo.experimental.AbstractAccumuloIndexer;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.domain.RyaStatement;
@@ -85,6 +74,15 @@ import org.apache.rya.indexing.accumulo.freetext.query.QueryParser;
 import org.apache.rya.indexing.accumulo.freetext.query.QueryParserTreeConstants;
 import org.apache.rya.indexing.accumulo.freetext.query.SimpleNode;
 import org.apache.rya.indexing.accumulo.freetext.query.TokenMgrError;
+import org.openrdf.model.Literal;
+import org.openrdf.model.Statement;
+import org.openrdf.model.URI;
+import org.openrdf.query.QueryEvaluationException;
+
+import com.google.common.base.Charsets;
+import com.google.common.collect.Lists;
+
+import info.aduna.iteration.CloseableIteration;
 
 /**
  * The {@link AccumuloFreeTextIndexer} stores and queries "free text" data from statements into tables in Accumulo. Specifically, this class
@@ -218,28 +216,28 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
 
     private void initInternal() throws AccumuloException, AccumuloSecurityException, TableNotFoundException,
             TableExistsException {
-        String doctable = getFreeTextDocTablename(conf);
-        String termtable = getFreeTextTermTablename(conf);
+        final String doctable = getFreeTextDocTablename(conf);
+        final String termtable = getFreeTextTermTablename(conf);
 
         docTableNumPartitions = ConfigUtils.getFreeTextDocNumPartitions(conf);
-        int termTableNumPartitions = ConfigUtils.getFreeTextTermNumPartitions(conf);
+        final int termTableNumPartitions = ConfigUtils.getFreeTextTermNumPartitions(conf);
 
-        TableOperations tableOps = ConfigUtils.getConnector(conf).tableOperations();
+        final TableOperations tableOps = ConfigUtils.getConnector(conf).tableOperations();
 
         // Create term table partitions
-        boolean createdTermTable = ConfigUtils.createTableIfNotExists(conf, termtable);
+        final boolean createdTermTable = ConfigUtils.createTableIfNotExists(conf, termtable);
         if (createdTermTable && !ConfigUtils.useMockInstance(conf) && termTableNumPartitions > 0) {
-            TreeSet<Text> splits = new TreeSet<Text>();
+            final TreeSet<Text> splits = new TreeSet<Text>();
 
             // split on the "Term List" and "Reverse Term list" boundary
             splits.add(new Text(ColumnPrefixes.getRevTermListColFam("")));
 
             // Symmetrically split the "Term List" and "Reverse Term list"
-            int numSubpartitions = ((termTableNumPartitions - 1) / 2);
+            final int numSubpartitions = ((termTableNumPartitions - 1) / 2);
             if (numSubpartitions > 0) {
-                int step = (26 / numSubpartitions);
+                final int step = (26 / numSubpartitions);
                 for (int i = 0; i < numSubpartitions; i++) {
-                    String nextChar = String.valueOf((char) ('a' + (step * i)));
+                    final String nextChar = String.valueOf((char) ('a' + (step * i)));
                     splits.add(new Text(ColumnPrefixes.getTermListColFam(nextChar)));
                     splits.add(new Text(ColumnPrefixes.getRevTermListColFam(nextChar)));
                 }
@@ -248,9 +246,9 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
         }
 
         // Create document (text) table partitions
-        boolean createdDocTable = ConfigUtils.createTableIfNotExists(conf, doctable);
+        final boolean createdDocTable = ConfigUtils.createTableIfNotExists(conf, doctable);
         if (createdDocTable && !ConfigUtils.useMockInstance(conf)) {
-            TreeSet<Text> splits = new TreeSet<Text>();
+            final TreeSet<Text> splits = new TreeSet<Text>();
             for (int i = 0; i < docTableNumPartitions; i++) {
                 splits.add(genPartition(i, docTableNumPartitions));
             }
@@ -276,7 +274,7 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
 
   //initialization occurs in setConf because index is created using reflection
     @Override
-    public void setConf(Configuration conf) {
+    public void setConf(final Configuration conf) {
         this.conf = conf;
         if (!isInit) {
             try {
@@ -291,34 +289,34 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
 
     @Override
     public Configuration getConf() {
-        return this.conf;
+        return conf;
     }
 
 
-    private void storeStatement(Statement statement) throws IOException {
+    private void storeStatement(final Statement statement) throws IOException {
         // if the predicate list is empty, accept all predicates.
         // Otherwise, make sure the predicate is on the "valid" list
-        boolean isValidPredicate = validPredicates.isEmpty() || validPredicates.contains(statement.getPredicate());
+        final boolean isValidPredicate = validPredicates.isEmpty() || validPredicates.contains(statement.getPredicate());
 
         if (isValidPredicate && (statement.getObject() instanceof Literal)) {
 
             // Get the tokens
-            String text = statement.getObject().stringValue().toLowerCase();
-            SortedSet<String> tokens = tokenizer.tokenize(text);
+            final String text = statement.getObject().stringValue().toLowerCase();
+            final SortedSet<String> tokens = tokenizer.tokenize(text);
 
             if (!tokens.isEmpty()) {
                 // Get Document Data
-                String docContent = StatementSerializer.writeStatement(statement);
+                final String docContent = StatementSerializer.writeStatement(statement);
 
-                String docId = Md5Hash.md5Base64(docContent);
+                final String docId = Md5Hash.md5Base64(docContent);
 
                 // Setup partition
-                Text partition = genPartition(docContent.hashCode(), docTableNumPartitions);
+                final Text partition = genPartition(docContent.hashCode(), docTableNumPartitions);
 
-                Mutation docTableMut = new Mutation(partition);
-                List<Mutation> termTableMutations = new ArrayList<Mutation>();
+                final Mutation docTableMut = new Mutation(partition);
+                final List<Mutation> termTableMutations = new ArrayList<Mutation>();
 
-                Text docIdText = new Text(docId);
+                final Text docIdText = new Text(docId);
 
                 // Store the Document Data
                 docTableMut.put(ColumnPrefixes.DOCS_CF_PREFIX, docIdText, new Value(docContent.getBytes(Charsets.UTF_8)));
@@ -330,7 +328,7 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
                 docTableMut.put(ColumnPrefixes.getContextColFam(statement), docIdText, EMPTY_VALUE);
 
                 // index the statement terms
-                for (String token : tokens) {
+                for (final String token : tokens) {
                     // tie the token to the document
                     docTableMut.put(ColumnPrefixes.getTermColFam(token), docIdText, EMPTY_VALUE);
 
@@ -343,7 +341,7 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
                 try {
                     docTableBw.addMutation(docTableMut);
                     termTableBw.addMutations(termTableMutations);
-                } catch (MutationsRejectedException e) {
+                } catch (final MutationsRejectedException e) {
                     logger.error("error adding mutation", e);
                     throw new IOException(e);
                 }
@@ -354,24 +352,24 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
     }
 
     @Override
-    public void storeStatement(RyaStatement statement) throws IOException {
+    public void storeStatement(final RyaStatement statement) throws IOException {
         storeStatement(RyaToRdfConversions.convertStatement(statement));
     }
 
-    private static Mutation createEmptyPutMutation(Text row) {
-        Mutation m = new Mutation(row);
+    private static Mutation createEmptyPutMutation(final Text row) {
+        final Mutation m = new Mutation(row);
         m.put(EMPTY_TEXT, EMPTY_TEXT, EMPTY_VALUE);
         return m;
     }
 
-    private static Mutation createEmptyPutDeleteMutation(Text row) {
-        Mutation m = new Mutation(row);
+    private static Mutation createEmptyPutDeleteMutation(final Text row) {
+        final Mutation m = new Mutation(row);
         m.putDelete(EMPTY_TEXT, EMPTY_TEXT);
         return m;
     }
 
-    private static Text genPartition(int partition, int numParitions) {
-        int length = Integer.toString(numParitions).length();
+    private static Text genPartition(final int partition, final int numParitions) {
+        final int length = Integer.toString(numParitions).length();
         return new Text(String.format("%0" + length + "d", Math.abs(partition % numParitions)));
     }
 
@@ -385,7 +383,7 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
     public void flush() throws IOException {
         try {
             mtbw.flush();
-        } catch (MutationsRejectedException e) {
+        } catch (final MutationsRejectedException e) {
             logger.error("error flushing the batch writer", e);
             throw new IOException(e);
         }
@@ -396,31 +394,31 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
     public void close() throws IOException {
         try {
             mtbw.close();
-        } catch (MutationsRejectedException e) {
+        } catch (final MutationsRejectedException e) {
             logger.error("error closing the batch writer", e);
             throw new IOException(e);
         }
     }
 
-    private Set<String> unrollWildcard(String string, boolean reverse) throws IOException {
-        Scanner termTableScan = getScanner(getFreeTextTermTablename(conf));
+    private Set<String> unrollWildcard(final String string, final boolean reverse) throws IOException {
+        final Scanner termTableScan = getScanner(getFreeTextTermTablename(conf));
 
-        Set<String> unrolledTerms = new HashSet<String>();
+        final Set<String> unrolledTerms = new HashSet<String>();
 
         Text queryTerm;
         if (reverse) {
-            String t = StringUtils.removeStart(string, "*").toLowerCase();
+            final String t = StringUtils.removeStart(string, "*").toLowerCase();
             queryTerm = ColumnPrefixes.getRevTermListColFam(t);
         } else {
-            String t = StringUtils.removeEnd(string, "*").toLowerCase();
+            final String t = StringUtils.removeEnd(string, "*").toLowerCase();
             queryTerm = ColumnPrefixes.getTermListColFam(t);
         }
 
         // perform query and read results
         termTableScan.setRange(Range.prefix(queryTerm));
 
-        for (Entry<Key, Value> e : termTableScan) {
-            String term = ColumnPrefixes.removePrefix(e.getKey().getRow()).toString();
+        for (final Entry<Key, Value> e : termTableScan) {
+            final String term = ColumnPrefixes.removePrefix(e.getKey().getRow()).toString();
             if (reverse) {
                 unrolledTerms.add(StringUtils.reverse(term));
             } else {
@@ -436,25 +434,25 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
         return unrolledTerms;
     }
 
-    private void unrollWildcards(SimpleNode node) throws IOException {
+    private void unrollWildcards(final SimpleNode node) throws IOException {
         if (node instanceof ASTExpression || node instanceof ASTSimpleNode) {
-            for (SimpleNode n : getNodeIterator(node)) {
+            for (final SimpleNode n : getNodeIterator(node)) {
                 unrollWildcards(n);
             }
         } else if (node instanceof ASTTerm) {
-            ASTTerm term = (ASTTerm) node;
-            boolean isWildTerm = term.getType().equals(ASTTerm.WILDTERM);
-            boolean isPreWildTerm = term.getType().equals(ASTTerm.PREFIXTERM);
+            final ASTTerm term = (ASTTerm) node;
+            final boolean isWildTerm = term.getType().equals(ASTTerm.WILDTERM);
+            final boolean isPreWildTerm = term.getType().equals(ASTTerm.PREFIXTERM);
             if (isWildTerm || isPreWildTerm) {
-                Set<String> unrolledTerms = unrollWildcard(term.getTerm(), isPreWildTerm);
+                final Set<String> unrolledTerms = unrollWildcard(term.getTerm(), isPreWildTerm);
 
                 // create a new expression
-                ASTExpression newExpression = new ASTExpression(QueryParserTreeConstants.JJTEXPRESSION);
+                final ASTExpression newExpression = new ASTExpression(QueryParserTreeConstants.JJTEXPRESSION);
                 newExpression.setType(ASTExpression.OR);
                 newExpression.setNotFlag(term.isNotFlag());
 
-                for (String unrolledTerm : unrolledTerms) {
-                    ASTTerm t = new ASTTerm(QueryParserTreeConstants.JJTTERM);
+                for (final String unrolledTerm : unrolledTerms) {
+                    final ASTTerm t = new ASTTerm(QueryParserTreeConstants.JJTTERM);
                     t.setNotFlag(false);
                     t.setTerm(unrolledTerm);
                     t.setType(ASTTerm.TERM);
@@ -462,8 +460,8 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
                 }
 
                 // replace "term" node with "expression" node in "term" node parent
-                SimpleNode parent = (SimpleNode) term.jjtGetParent();
-                int index = ASTNodeUtils.getChildIndex(parent, term);
+                final SimpleNode parent = (SimpleNode) term.jjtGetParent();
+                final int index = ASTNodeUtils.getChildIndex(parent, term);
 
                 Validate.isTrue(index >= 0, "child not found in parent");
 
@@ -475,7 +473,7 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
         }
     }
 
-    private Scanner getScanner(String tablename) throws IOException {
+    private Scanner getScanner(final String tablename) throws IOException {
         try {
             return ConfigUtils.createScanner(tablename, conf);
         } catch (AccumuloException | AccumuloSecurityException | TableNotFoundException e) {
@@ -486,9 +484,9 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
 
     /** {@inheritDoc} */
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> queryText(String query, StatementConstraints contraints)
+    public CloseableIteration<Statement, QueryEvaluationException> queryText(final String query, final StatementConstraints contraints)
             throws IOException {
-        Scanner docTableScan = getScanner(getFreeTextDocTablename(conf));
+        final Scanner docTableScan = getScanner(getFreeTextDocTablename(conf));
 
         // test the query to see if it's parses correctly.
         SimpleNode root = parseQuery(query);
@@ -496,10 +494,10 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
         // unroll any wildcard nodes before it goes to the server
         unrollWildcards(root);
 
-        String unrolledQuery = ASTNodeUtils.serializeExpression(root);
+        final String unrolledQuery = ASTNodeUtils.serializeExpression(root);
 
         // Add S P O C constraints to query
-        StringBuilder constrainedQuery = new StringBuilder("(" + unrolledQuery + ")");
+        final StringBuilder constrainedQuery = new StringBuilder("(" + unrolledQuery + ")");
 
         if (contraints.hasSubject()) {
             constrainedQuery.append(" AND ");
@@ -511,8 +509,8 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
         }
         if (contraints.hasPredicates()) {
             constrainedQuery.append(" AND (");
-            List<String> predicates = new ArrayList<String>();
-            for (URI u : contraints.getPredicates()) {
+            final List<String> predicates = new ArrayList<String>();
+            for (final URI u : contraints.getPredicates()) {
                 predicates.add(ColumnPrefixes.getPredColFam(u.stringValue()).toString());
             }
             constrainedQuery.append(StringUtils.join(predicates, " OR "));
@@ -521,7 +519,7 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
 
         // Verify that the query is a reasonable size
         root = parseQuery(constrainedQuery.toString());
-        int termCount = ASTNodeUtils.termCount(root);
+        final int termCount = ASTNodeUtils.termCount(root);
 
         if (termCount > queryTermLimit) {
             throw new IOException("Query contains too many terms.  Term limit: " + queryTermLimit + ".  Term Count: " + termCount);
@@ -531,9 +529,9 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
         docTableScan.clearScanIterators();
         docTableScan.clearColumns();
 
-        int iteratorPriority = 20;
-        String iteratorName = "booleanTree";
-        IteratorSetting ii = new IteratorSetting(iteratorPriority, iteratorName, BooleanTreeIterator.class);
+        final int iteratorPriority = 20;
+        final String iteratorName = "booleanTree";
+        final IteratorSetting ii = new IteratorSetting(iteratorPriority, iteratorName, BooleanTreeIterator.class);
         BooleanTreeIterator.setQuery(ii, constrainedQuery.toString());
         docTableScan.addScanIterator(ii);
         docTableScan.setRange(new Range());
@@ -553,16 +551,16 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
 
             @Override
             public Statement next() throws QueryEvaluationException {
-                Entry<Key, Value> entry = i.next();
-                Value v = entry.getValue();
+                final Entry<Key, Value> entry = i.next();
+                final Value v = entry.getValue();
                 try {
-                    String dataString = Text.decode(v.get(), 0, v.getSize());
-                    Statement s = StatementSerializer.readStatement(dataString);
+                    final String dataString = Text.decode(v.get(), 0, v.getSize());
+                    final Statement s = StatementSerializer.readStatement(dataString);
                     return s;
-                } catch (CharacterCodingException e) {
+                } catch (final CharacterCodingException e) {
                     logger.error("Error decoding value", e);
                     throw new QueryEvaluationException(e);
-                } catch (IOException e) {
+                } catch (final IOException e) {
                     logger.error("Error deserializing statement", e);
                     throw new QueryEvaluationException(e);
                 }
@@ -590,14 +588,14 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
      * @return
      * @throws IOException
      */
-    private static SimpleNode parseQuery(String query) throws IOException {
+    private static SimpleNode parseQuery(final String query) throws IOException {
         SimpleNode root = null;
         try {
             root = QueryParser.parse(query);
-        } catch (ParseException e) {
+        } catch (final ParseException e) {
             logger.error("Parser Exception on Client Side. Query: " + query, e);
             throw new IOException(e);
-        } catch (TokenMgrError e) {
+        } catch (final TokenMgrError e) {
             logger.error("Token Manager Exception on Client Side. Query: " + query, e);
             throw new IOException(e);
         }
@@ -605,67 +603,110 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
     }
 
     /**
-     * Get Free Text Document index table's name 
-     * Use the two table version of this below. This one is required by base class. 
+     * Get Free Text Document index table's name
+     * Use the two table version of this below. This one is required by base class.
      */
     @Override
     public String getTableName() {
        return getFreeTextDocTablename(conf);
     }
-    
+
     /**
-     * Get all the tables used by this index.
-     * @param conf configuration map
-     * @return an unmodifiable list of all the table names.
+     * Make the Accumulo table names used by this indexer for a specific instance of Rya.
+     *
+     * @param conf - The Rya configuration that specifies which instance of Rya
+     *   the table names will be built for. (not null)
+     * @return The Accumulo table names used by this indexer for a specific instance of Rya.
      */
-    public static List<String> getTableNames(Configuration conf) {
-        return Collections.unmodifiableList( Arrays.asList( 
-                getFreeTextDocTablename(conf),
-                getFreeTextTermTablename(conf) ));
+    public static List<String> getTableNames(final Configuration conf) {
+        requireNonNull(conf);
+        return Collections.unmodifiableList(
+                makeTableNames(ConfigUtils.getTablePrefix(conf) ) );
     }
-    
+
     /**
      * Get the Document index's table name.
-     * @param conf
-     * @return the Free Text Document index table's name
+     *
+     * @param conf - The Rya configuration that specifies which instance of Rya
+     *   the table names will be built for. (not null)
+     * @return The Free Text Document index's Accumulo table name for the Rya instance.
      */
-    public static String getFreeTextDocTablename(Configuration conf) {
-        return org.apache.rya.indexing.accumulo.ConfigUtils.getTablePrefix(conf)  + TABLE_SUFFFIX_DOC;
+    public static String getFreeTextDocTablename(final Configuration conf) {
+        requireNonNull(conf);
+        return makeFreeTextDocTablename( ConfigUtils.getTablePrefix(conf) );
     }
 
     /**
      * Get the Term index's table name.
-     * @param conf
-     * @return the Free Text Term index table's name
+     *
+     * @param conf - The Rya configuration that specifies which instance of Rya
+     *   the table names will be built for. (not null)
+     * @return The Free Text Term index's Accumulo table name for the Rya instance.
+     */
+    public static String getFreeTextTermTablename(final Configuration conf) {
+        requireNonNull(conf);
+        return makeFreeTextTermTablename( ConfigUtils.getTablePrefix(conf) );
+    }
+
+    /**
+     * Make the Accumulo table names used by this indexer for a specific instance of Rya.
+     *
+     * @param ryaInstanceName - The name of the Rya instance the table names are for. (not null)
+     * @return The Accumulo table names used by this indexer for a specific instance of Rya.
+     */
+    public static List<String> makeTableNames(final String ryaInstanceName) {
+        requireNonNull(ryaInstanceName);
+        return Lists.newArrayList(
+                makeFreeTextDocTablename(ryaInstanceName),
+                makeFreeTextTermTablename(ryaInstanceName));
+    }
+
+    /**
+     * Make the Document index's table name.
+     *
+     * @param ryaInstanceName - The name of the Rya instance the table names are for. (not null)
+     * @return The Free Text Document index's Accumulo table name for the Rya instance.
+     */
+    public static String makeFreeTextDocTablename(final String ryaInstanceName) {
+        requireNonNull(ryaInstanceName);
+        return ryaInstanceName + TABLE_SUFFFIX_DOC;
+    }
+
+    /**
+     * Make the Term index's table name.
+     *
+     * @param ryaInstanceName - The name of the Rya instance the table names are for. (not null)
+     * @return The Free Text Term index's Accumulo table name for the Rya instance.
      */
-    public static String getFreeTextTermTablename(Configuration conf) {
-        return org.apache.rya.indexing.accumulo.ConfigUtils.getTablePrefix(conf)  + TABLE_SUFFIX_TERM;
+    public static String makeFreeTextTermTablename(final String ryaInstanceName) {
+        requireNonNull(ryaInstanceName);
+        return ryaInstanceName + TABLE_SUFFIX_TERM;
     }
 
-    private void deleteStatement(Statement statement) throws IOException {
+    private void deleteStatement(final Statement statement) throws IOException {
         // if the predicate list is empty, accept all predicates.
         // Otherwise, make sure the predicate is on the "valid" list
-        boolean isValidPredicate = validPredicates.isEmpty() || validPredicates.contains(statement.getPredicate());
+        final boolean isValidPredicate = validPredicates.isEmpty() || validPredicates.contains(statement.getPredicate());
 
         if (isValidPredicate && (statement.getObject() instanceof Literal)) {
 
             // Get the tokens
-            String text = statement.getObject().stringValue().toLowerCase();
-            SortedSet<String> tokens = tokenizer.tokenize(text);
+            final String text = statement.getObject().stringValue().toLowerCase();
+            final SortedSet<String> tokens = tokenizer.tokenize(text);
 
             if (!tokens.isEmpty()) {
                 // Get Document Data
-                String docContent = StatementSerializer.writeStatement(statement);
+                final String docContent = StatementSerializer.writeStatement(statement);
 
-                String docId = Md5Hash.md5Base64(docContent);
+                final String docId = Md5Hash.md5Base64(docContent);
 
                 // Setup partition
-                Text partition = genPartition(docContent.hashCode(), docTableNumPartitions);
+                final Text partition = genPartition(docContent.hashCode(), docTableNumPartitions);
 
-                Mutation docTableMut = new Mutation(partition);
-                List<Mutation> termTableMutations = new ArrayList<Mutation>();
+                final Mutation docTableMut = new Mutation(partition);
+                final List<Mutation> termTableMutations = new ArrayList<Mutation>();
 
-                Text docIdText = new Text(docId);
+                final Text docIdText = new Text(docId);
 
                 // Delete the Document Data
                 docTableMut.putDelete(ColumnPrefixes.DOCS_CF_PREFIX, docIdText);
@@ -678,10 +719,10 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
 
 
                 // Delete the statement terms in index
-                for (String token : tokens) {
+                for (final String token : tokens) {
                     if (IS_TERM_TABLE_TOKEN_DELETION_ENABLED) {
-                        int rowId = Integer.parseInt(partition.toString());
-                        boolean doesTermExistInOtherDocs = doesTermExistInOtherDocs(token, rowId, docIdText);
+                        final int rowId = Integer.parseInt(partition.toString());
+                        final boolean doesTermExistInOtherDocs = doesTermExistInOtherDocs(token, rowId, docIdText);
                         // Only delete the term from the term table if it doesn't appear in other docs
                         if (!doesTermExistInOtherDocs) {
                             // Delete the term in the term table
@@ -698,7 +739,7 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
                 try {
                     docTableBw.addMutation(docTableMut);
                     termTableBw.addMutations(termTableMutations);
-                } catch (MutationsRejectedException e) {
+                } catch (final MutationsRejectedException e) {
                     logger.error("error adding mutation", e);
                     throw new IOException(e);
                 }
@@ -708,7 +749,7 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
     }
 
     @Override
-    public void deleteStatement(RyaStatement statement) throws IOException {
+    public void deleteStatement(final RyaStatement statement) throws IOException {
         deleteStatement(RyaToRdfConversions.convertStatement(statement));
     }
 
@@ -718,36 +759,36 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
      * @param currentDocId the current document ID that the search term exists in.
      * @return {@code true} if the term was found in other documents. {@code false} otherwise.
      */
-    private boolean doesTermExistInOtherDocs(String term, int currentDocId, Text docIdText) {
+    private boolean doesTermExistInOtherDocs(final String term, final int currentDocId, final Text docIdText) {
         try {
-            String freeTextDocTableName = getFreeTextDocTablename(conf);
-            Scanner scanner = getScanner(freeTextDocTableName);
+            final String freeTextDocTableName = getFreeTextDocTablename(conf);
+            final Scanner scanner = getScanner(freeTextDocTableName);
 
-            String t = StringUtils.removeEnd(term, "*").toLowerCase();
-            Text queryTerm = ColumnPrefixes.getTermColFam(t);
+            final String t = StringUtils.removeEnd(term, "*").toLowerCase();
+            final Text queryTerm = ColumnPrefixes.getTermColFam(t);
 
             // perform query and read results
             scanner.fetchColumnFamily(queryTerm);
 
-            for (Entry<Key, Value> entry : scanner) {
-                Key key = entry.getKey();
-                Text row = key.getRow();
-                int rowId = Integer.parseInt(row.toString());
+            for (final Entry<Key, Value> entry : scanner) {
+                final Key key = entry.getKey();
+                final Text row = key.getRow();
+                final int rowId = Integer.parseInt(row.toString());
                 // We only want to check other documents from the one we're deleting
                 if (rowId != currentDocId) {
-                    Text columnFamily = key.getColumnFamily();
-                    String columnFamilyValue = columnFamily.toString();
+                    final Text columnFamily = key.getColumnFamily();
+                    final String columnFamilyValue = columnFamily.toString();
                     // Check that the value has the term prefix
                     if (columnFamilyValue.startsWith(ColumnPrefixes.TERM_CF_PREFIX.toString())) {
-                        Text text = ColumnPrefixes.removePrefix(columnFamily);
-                        String value = text.toString();
+                        final Text text = ColumnPrefixes.removePrefix(columnFamily);
+                        final String value = text.toString();
                         if (value.equals(term)) {
                             return true;
                         }
                     }
                 }
             }
-        } catch (IOException e) {
+        } catch (final IOException e) {
             logger.error("Error searching for the existance of the term in other documents", e);
         }
         return false;
@@ -757,34 +798,34 @@ public class AccumuloFreeTextIndexer extends AbstractAccumuloIndexer implements
 	@Override
 	public void init() {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 
 	@Override
-	public void setConnector(Connector connector) {
+	public void setConnector(final Connector connector) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 
 	@Override
 	public void destroy() {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 
 	@Override
-	public void purge(RdfCloudTripleStoreConfiguration configuration) {
+	public void purge(final RdfCloudTripleStoreConfiguration configuration) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 
 	@Override
 	public void dropAndDestroy() {
 		// TODO Auto-generated method stub
-		
+
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java
index 1a5e803..e9d6c30 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java
@@ -18,8 +18,11 @@
  */
 package org.apache.rya.indexing.accumulo.temporal;
 
+import static java.util.Objects.requireNonNull;
+
 import java.io.IOException;
 import java.nio.charset.CharacterCodingException;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -51,15 +54,6 @@ import org.apache.commons.codec.binary.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
 import org.apache.log4j.Logger;
-import org.joda.time.DateTime;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
-
-import java.util.Arrays;
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.accumulo.experimental.AbstractAccumuloIndexer;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.domain.RyaStatement;
@@ -72,6 +66,14 @@ import org.apache.rya.indexing.TemporalInstant;
 import org.apache.rya.indexing.TemporalInstantRfc3339;
 import org.apache.rya.indexing.TemporalInterval;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.joda.time.DateTime;
+import org.openrdf.model.Literal;
+import org.openrdf.model.Resource;
+import org.openrdf.model.Statement;
+import org.openrdf.model.URI;
+import org.openrdf.query.QueryEvaluationException;
+
+import info.aduna.iteration.CloseableIteration;
 
 public class AccumuloTemporalIndexer extends AbstractAccumuloIndexer implements TemporalIndexer {
 
@@ -878,7 +880,18 @@ public class AccumuloTemporalIndexer extends AbstractAccumuloIndexer implements
 
     @Override
     public String getTableName() {
-       return ConfigUtils.getTablePrefix(conf)  + TABLE_SUFFIX;
+       return makeTableName( ConfigUtils.getTablePrefix(conf) );
+    }
+
+    /**
+     * Make the Accumulo table name used by this indexer 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 indexer for a specific instance of Rya.
+     */
+    public static String makeTableName(final String ryaInstanceName) {
+        requireNonNull(ryaInstanceName);
+        return ryaInstanceName + TABLE_SUFFIX;
     }
 
     private void deleteStatement(final Statement statement) throws IOException, IllegalArgumentException {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloAddUserIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloAddUserIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloAddUserIT.java
new file mode 100644
index 0000000..53e0bf6
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloAddUserIT.java
@@ -0,0 +1,267 @@
+/*
+ * 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 org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.admin.SecurityOperations;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+import org.apache.accumulo.core.security.SystemPermission;
+import org.apache.rya.accumulo.AccumuloITBase;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.api.client.Install.InstallConfiguration;
+import org.apache.rya.api.client.RyaClient;
+import org.apache.rya.api.instance.RyaDetails;
+import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.apache.rya.sail.config.RyaSailFactory;
+import org.junit.Test;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.sail.Sail;
+import org.openrdf.sail.SailConnection;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Integration tests the methods of {@link AccumuloAddUser}.
+ */
+public class AccumuloAddUserIT extends AccumuloITBase {
+
+    /**
+     * Ensure that the user who installs the instance of Rya is reported as being a user who can access it.
+     */
+    @Test
+    public void ryaDetailsIncludesOriginalUser() throws Exception {
+        final SecurityOperations secOps = super.getConnector().securityOperations();
+
+        // Create the user that will install the instance of Rya.
+        secOps.createLocalUser("userA", new PasswordToken("userA"));
+        secOps.grantSystemPermission("userA", SystemPermission.CREATE_TABLE);
+
+        // Create a Rya Client for that user.
+        final RyaClient userAClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userA", "userA".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userA", "userA"));
+
+        // Install the instance of Rya.
+        userAClient.getInstall().install("testInstance_", InstallConfiguration.builder().build());
+
+        // Ensure the Rya instance's details only contain the username of the user who installed the instance.
+        final ImmutableList<String> expectedUsers = ImmutableList.<String>builder()
+                .add("userA")
+                .build();
+
+        final RyaDetails details = userAClient.getGetInstanceDetails().getDetails("testInstance_").get();
+        assertEquals(expectedUsers, details.getUsers());
+    }
+
+    /**
+     * Ensure that when a user is added to a Rya instance that its details are updated to include the new user.
+     */
+    @Test
+    public void userAddedAlsoAddedToRyaDetails() throws Exception {
+        final SecurityOperations secOps = super.getConnector().securityOperations();
+
+        // Create the user that will install the instance of Rya.
+        secOps.createLocalUser("userA", new PasswordToken("userA"));
+        secOps.grantSystemPermission("userA", SystemPermission.CREATE_TABLE);
+
+        final RyaClient userAClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userA", "userA".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userA", "userA"));
+
+        // Create the user that will be added to the instance of Rya.
+        secOps.createLocalUser("userB", new PasswordToken("userB"));
+
+        // Install the instance of Rya.
+        userAClient.getInstall().install("testInstance_", InstallConfiguration.builder().build());
+
+        // Add the user.
+        userAClient.getAddUser().addUser("testInstance_", "userB");
+
+        // Ensure the Rya instance's details have been updated to include the added user.
+        final ImmutableList<String> expectedUsers = ImmutableList.<String>builder()
+                .add("userA")
+                .add("userB")
+                .build();
+
+        final RyaDetails details = userAClient.getGetInstanceDetails().getDetails("testInstance_").get();
+        assertEquals(expectedUsers, details.getUsers());
+    }
+
+    /**
+     * Ensure a user that has not been added to the Rya instance can not interact with it.
+     */
+    @Test
+    public void userNotAddedCanNotInsert() throws Exception {
+        final SecurityOperations secOps = super.getConnector().securityOperations();
+
+        // Create the user that will install the instance of Rya.
+        secOps.createLocalUser("userA", new PasswordToken("userA"));
+        secOps.grantSystemPermission("userA", SystemPermission.CREATE_TABLE);
+
+        final RyaClient userAClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userA", "userA".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userA", "userA"));
+
+        // Install the instance of Rya.
+        userAClient.getInstall().install("testInstance_", InstallConfiguration.builder().build());
+
+        // Create the user that will not be added to the instance of Rya, but will try to scan it.
+        secOps.createLocalUser("userB", new PasswordToken("userB"));
+
+        //Try to add a statement the Rya instance with the unauthorized user. This should fail.
+        boolean securityExceptionThrown = false;
+
+        Sail sail = null;
+        SailConnection sailConn = null;
+        try {
+            final AccumuloRdfConfiguration userBConf = makeRyaConfig("testInstance_", "userB", "userB", getInstanceName(), getZookeepers());
+            sail = RyaSailFactory.getInstance(userBConf);
+            sailConn = sail.getConnection();
+
+            final ValueFactory vf = sail.getValueFactory();
+            sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"));
+
+        } catch(final RuntimeException e) {
+            final Throwable cause = e.getCause();
+            if(cause instanceof AccumuloSecurityException) {
+                securityExceptionThrown = true;
+            }
+        } finally {
+            if(sailConn != null) {
+                try {
+                    sailConn.close();
+                } finally { }
+            }
+            if(sail != null) {
+                try {
+                    sail.shutDown();
+                } finally { }
+            }
+        }
+
+        assertTrue(securityExceptionThrown);
+    }
+
+    /**
+     * Ensure a user that has been added to the Rya instance can interact with it.
+     */
+    @Test
+    public void userAddedCanInsert() throws Exception {
+        final SecurityOperations secOps = super.getConnector().securityOperations();
+
+        // Create the user that will install the instance of Rya.
+        secOps.createLocalUser("userA", new PasswordToken("userA"));
+        secOps.grantSystemPermission("userA", SystemPermission.CREATE_TABLE);
+
+        final RyaClient userAClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userA", "userA".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userA", "userA"));
+
+        // Create the user that will not be added to the instance of Rya, but will try to scan it.
+        secOps.createLocalUser("userB", new PasswordToken("userB"));
+
+        // Install the instance of Rya.
+        userAClient.getInstall().install("testInstance_", InstallConfiguration.builder().build());
+
+        // Add the user.
+        userAClient.getAddUser().addUser("testInstance_", "userB");
+
+        // Try to add a statement to the Rya instance. This should succeed.
+        Sail sail = null;
+        SailConnection sailConn = null;
+
+        try {
+            final AccumuloRdfConfiguration userBConf = makeRyaConfig("testInstance_", "userB", "userB", getInstanceName(), getZookeepers());
+            sail = RyaSailFactory.getInstance(userBConf);
+            sailConn = sail.getConnection();
+
+            final ValueFactory vf = sail.getValueFactory();
+            sailConn.begin();
+            sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"));
+            sailConn.close();
+
+        } finally {
+            if(sailConn != null) {
+                try {
+                    sailConn.close();
+                } finally { }
+            }
+            if(sail != null) {
+                try {
+                    sail.shutDown();
+                } finally { }
+            }
+        }
+    }
+
+    /**
+     * Ensure nothing happens if you try to add a user that is already there.
+     */
+    @Test
+    public void addUserTwice() throws Exception {
+        final SecurityOperations secOps = super.getConnector().securityOperations();
+
+        // Create the user that will install the instance of Rya.
+        secOps.createLocalUser("userA", new PasswordToken("userA"));
+        secOps.grantSystemPermission("userA", SystemPermission.CREATE_TABLE);
+
+        final RyaClient userAClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userA", "userA".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userA", "userA"));
+
+        // Create the user that will not be added to the instance of Rya, but will try to scan it.
+        secOps.createLocalUser("userB", new PasswordToken("userB"));
+
+        // Install the instance of Rya.
+        userAClient.getInstall().install("testInstance_", InstallConfiguration.builder().build());
+
+        // Add the user.
+        userAClient.getAddUser().addUser("testInstance_", "userB");
+        userAClient.getAddUser().addUser("testInstance_", "userB");
+
+        // Ensure the Rya instance's details only contain the username of the user who installed the instance.
+        final ImmutableList<String> expectedUsers = ImmutableList.<String>builder()
+                .add("userA")
+                .add("userB")
+                .build();
+
+        final RyaDetails details = userAClient.getGetInstanceDetails().getDetails("testInstance_").get();
+        assertEquals(expectedUsers, details.getUsers());
+    }
+
+    private static AccumuloRdfConfiguration makeRyaConfig(
+            final String ryaInstanceName,
+            final String username,
+            final String password,
+            final String instanceName,
+            final String zookeepers) {
+        final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
+        conf.setTablePrefix(ryaInstanceName);
+        // Accumulo connection information.
+        conf.set(ConfigUtils.CLOUDBASE_USER, username);
+        conf.set(ConfigUtils.CLOUDBASE_PASSWORD, password);
+        conf.set(ConfigUtils.CLOUDBASE_INSTANCE, instanceName);
+        conf.set(ConfigUtils.CLOUDBASE_ZOOKEEPERS, zookeepers);
+        conf.set(ConfigUtils.CLOUDBASE_AUTHS, "");
+        return conf;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java
index 17cc6c7..30eb4ca 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java
@@ -23,15 +23,6 @@ import static org.junit.Assert.assertEquals;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
-import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
-import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
-
 import org.apache.rya.accumulo.AccumuloITBase;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.client.Install.InstallConfiguration;
@@ -39,7 +30,15 @@ import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinStorageType;
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinUpdaterType;
+import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
+import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.junit.Test;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.impl.MapBindingSet;
+import org.openrdf.sail.Sail;
+import org.openrdf.sail.SailConnection;
 
 /**
  * Integration tests the methods of {@link AccumuloBatchUpdatePCJ}.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloGetInstanceDetailsIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloGetInstanceDetailsIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloGetInstanceDetailsIT.java
index bf4b18c..df03e78 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloGetInstanceDetailsIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloGetInstanceDetailsIT.java
@@ -27,10 +27,6 @@ import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.TableExistsException;
 import org.apache.accumulo.core.client.admin.TableOperations;
-import org.junit.Test;
-
-import com.google.common.base.Optional;
-
 import org.apache.rya.accumulo.AccumuloITBase;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.client.GetInstanceDetails;
@@ -42,12 +38,14 @@ 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;
 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 AccumuloGetInstanceDetails}.
@@ -87,7 +85,7 @@ public class AccumuloGetInstanceDetailsIT extends AccumuloITBase {
                 // The version depends on how the test is packaged, so just grab whatever was stored.
                 .setRyaVersion( details.get().getRyaVersion() )
 
-                .setGeoIndexDetails( new GeoIndexDetails(true) )
+              //RYA-215                .setGeoIndexDetails( new GeoIndexDetails(true) )
                 .setTemporalIndexDetails(new TemporalIndexDetails(true) )
                 .setFreeTextDetails( new FreeTextIndexDetails(true) )
                 .setEntityCentricIndexDetails( new EntityCentricIndexDetails(true) )

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUserIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUserIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUserIT.java
new file mode 100644
index 0000000..69780bc
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUserIT.java
@@ -0,0 +1,168 @@
+/*
+ * 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 org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.admin.SecurityOperations;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+import org.apache.accumulo.core.security.SystemPermission;
+import org.apache.rya.accumulo.AccumuloITBase;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.api.client.Install.InstallConfiguration;
+import org.apache.rya.api.client.RyaClient;
+import org.apache.rya.api.instance.RyaDetails;
+import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.apache.rya.sail.config.RyaSailFactory;
+import org.junit.Test;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.sail.Sail;
+import org.openrdf.sail.SailConnection;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Integration tests the methods of {@link AccumuloRemoveUser}.
+ */
+public class AccumuloRemoveUserIT extends AccumuloITBase {
+
+    /**
+     * Ensure that when a user is removed from a Rya instance that its details are updated to no longer include the user.
+     */
+    @Test
+    public void removedUserNotInDetails() throws Exception {
+        final SecurityOperations secOps = super.getConnector().securityOperations();
+
+        // Create the user that will install the instance of Rya.
+        secOps.createLocalUser("userA", new PasswordToken("userA"));
+        secOps.grantSystemPermission("userA", SystemPermission.CREATE_TABLE);
+
+        final RyaClient userAClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userA", "userA".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userA", "userA"));
+
+        // Create the user that will be added to the instance of Rya.
+        secOps.createLocalUser("userB", new PasswordToken("userB"));
+
+        final RyaClient userBClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userB", "userB".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userB", "userB"));
+
+        // Install the instance of Rya.
+        userAClient.getInstall().install("testInstance_", InstallConfiguration.builder().build());
+
+        // Add userB.
+        userAClient.getAddUser().addUser("testInstance_", "userB");
+
+        // Remove userA.
+        userBClient.getRemoveUser().removeUser("testInstance_", "userA");
+
+        // Ensure the Rya instance's details have been updated to include the added user.
+        final ImmutableList<String> expectedUsers = ImmutableList.<String>builder()
+                .add("userB")
+                .build();
+
+        final RyaDetails details = userBClient.getGetInstanceDetails().getDetails("testInstance_").get();
+        assertEquals(expectedUsers, details.getUsers());
+    }
+
+    /**
+     * Ensure a user that has been removed from the Rya instance can not interact with it.
+     */
+    @Test
+    public void removedUserCanNotInsert() throws Exception {
+        final SecurityOperations secOps = super.getConnector().securityOperations();
+
+        // Create the user that will install the instance of Rya.
+        secOps.createLocalUser("userA", new PasswordToken("userA"));
+        secOps.grantSystemPermission("userA", SystemPermission.CREATE_TABLE);
+
+        final RyaClient userAClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userA", "userA".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userA", "userA"));
+
+        // Create the user that will be added to the instance of Rya.
+        secOps.createLocalUser("userB", new PasswordToken("userB"));
+
+        final RyaClient userBClient = AccumuloRyaClientFactory.build(
+                new AccumuloConnectionDetails("userB", "userB".toCharArray(), getInstanceName(), getZookeepers()),
+                super.getClusterInstance().getCluster().getConnector("userB", "userB"));
+
+        // Install the instance of Rya.
+        userAClient.getInstall().install("testInstance_", InstallConfiguration.builder().build());
+
+        // Add userB.
+        userAClient.getAddUser().addUser("testInstance_", "userB");
+
+        // Remove userA.
+        userBClient.getRemoveUser().removeUser("testInstance_", "userA");
+
+        // Show that userA can not insert anything.
+        boolean securityExceptionThrown = false;
+
+        Sail sail = null;
+        SailConnection sailConn = null;
+        try {
+            final AccumuloRdfConfiguration userAConf = makeRyaConfig("testInstance_", "userA", "userA", getInstanceName(), getZookeepers());
+            sail = RyaSailFactory.getInstance(userAConf);
+            sailConn = sail.getConnection();
+
+            final ValueFactory vf = sail.getValueFactory();
+            sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"));
+
+        } catch(final RuntimeException e) {
+            final Throwable cause = e.getCause();
+            if(cause instanceof AccumuloSecurityException) {
+                securityExceptionThrown = true;
+            }
+        } finally {
+            if(sailConn != null) {
+                try {
+                    sailConn.close();
+                } finally { }
+            }
+            if(sail != null) {
+                try {
+                    sail.shutDown();
+                } finally { }
+            }
+        }
+
+        assertTrue(securityExceptionThrown);
+    }
+
+    private static AccumuloRdfConfiguration makeRyaConfig(
+            final String ryaInstanceName,
+            final String username,
+            final String password,
+            final String instanceName,
+            final String zookeepers) {
+        final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
+        conf.setTablePrefix(ryaInstanceName);
+        // Accumulo connection information.
+        conf.set(ConfigUtils.CLOUDBASE_USER, username);
+        conf.set(ConfigUtils.CLOUDBASE_PASSWORD, password);
+        conf.set(ConfigUtils.CLOUDBASE_INSTANCE, instanceName);
+        conf.set(ConfigUtils.CLOUDBASE_ZOOKEEPERS, zookeepers);
+        conf.set(ConfigUtils.CLOUDBASE_AUTHS, "");
+        return conf;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/ab4fca46/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java
index 8cfa97e..751ecab 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java
@@ -38,13 +38,26 @@ import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.minicluster.MiniAccumuloCluster;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.log4j.Logger;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.accumulo.instance.AccumuloRyaInstanceDetailsRepository;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+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.indexing.accumulo.ConfigUtils;
 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;
 import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.openrdf.model.impl.NumericLiteralImpl;
 import org.openrdf.model.impl.URIImpl;
@@ -59,21 +72,6 @@ import com.google.common.collect.Sets;
 import com.google.common.io.Files;
 
 import info.aduna.iteration.CloseableIteration;
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.instance.AccumuloRyaInstanceDetailsRepository;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-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.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.indexing.accumulo.ConfigUtils;
 
 /**
  * Tests the evaluation of {@link AccumuloIndexSet}.
@@ -176,7 +174,7 @@ public class AccumuloIndexSetColumnVisibilityTest {
                 .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()