You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by dl...@apache.org on 2018/01/05 20:04:38 UTC

[4/4] incubator-rya git commit: Little bugs. closes #231

Little bugs.  closes #231


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

Branch: refs/heads/master
Commit: 7b571d43aa2a905df7db19798fdf47eca6606241
Parents: 4576f55
Author: David W. Lotts <da...@parsons.com>
Authored: Tue Oct 3 15:31:19 2017 -0400
Committer: David Lotts <da...@parsons.com>
Committed: Fri Jan 5 15:01:11 2018 -0500

----------------------------------------------------------------------
 .../java/org/apache/rya/api/log/LogUtils.java   |  57 ++
 .../java/org/apache/rya/api/path/PathUtils.java | 260 ++++++++
 .../rya/api/utils/XmlFactoryConfiguration.java  | 115 ++++
 dao/accumulo.rya/pom.xml                        |   5 +-
 .../rya/accumulo/AccumuloRdfEvalStatsDAO.java   |  19 +-
 .../org/apache/rya/accumulo/AccumuloRyaDAO.java |  51 +-
 .../accumulo/instance/RyaDetailsSerializer.java |  36 +-
 .../accumulo/query/AccumuloRyaQueryEngine.java  |  40 +-
 .../org/apache/rya/mongodb/MongoDBRyaDAO.java   |  28 +-
 .../dao/SimpleMongoDBStorageStrategy.java       |   2 +-
 .../mongodb/MongoDBRdfConfigurationTest.java    |   1 +
 .../client/accumulo/AccumuloBatchUpdatePCJ.java |   2 +-
 .../accumulo/AccumuloConnectionDetails.java     |  12 +-
 .../api/client/accumulo/AccumuloCreatePCJ.java  |   2 +-
 .../accumulo/AccumuloCreatePeriodicPCJ.java     |   2 +-
 .../api/client/accumulo/AccumuloDeletePCJ.java  |   2 +-
 .../accumulo/AccumuloDeletePeriodicPCJ.java     |   2 +-
 .../api/client/accumulo/AccumuloInstall.java    |   2 +-
 .../AccumuloListIncrementalQueries.java         |   2 +-
 .../api/client/accumulo/AccumuloUninstall.java  |   6 +-
 .../IndexedExecutionPlanGenerator.java          |   3 +-
 .../accumulo/entity/AccumuloDocIdIndexer.java   |   3 +
 .../entity/EntityLocalityGroupSetter.java       |   4 +-
 .../rya/indexing/accumulo/entity/StarQuery.java |   4 +-
 .../temporal/AccumuloTemporalIndexer.java       |   3 +
 .../external/PrecomputedJoinIndexer.java        |  30 +-
 .../indexing/external/matching/JoinSegment.java |   3 +-
 .../external/tupleSet/AccumuloIndexSet.java     |  57 +-
 .../client/accumulo/AccumuloDeletePCJIT.java    |  67 +++
 .../rya/api/client/accumulo/FluoITBase.java     |  44 +-
 .../indexing/accumulo/entity/StarQueryTest.java |  43 +-
 .../src/main/java/InferenceExamples.java        |   4 +-
 .../yarn/PeriodicNotificationTwillRunner.java   |   8 +-
 .../query/QueriesBenchmarkConfReader.java       |  28 +-
 .../src/main/xsd/queries-benchmark-conf.xsd     |   4 +-
 .../query/QueriesBenchmarkConfReaderIT.java     |   4 +-
 .../accumulo/AccumuloRyaStatementStore.java     |   7 +-
 .../AccumuloParentMetadataRepository.java       |   2 +-
 .../accumulo/util/AccumuloInstanceDriver.java   |  71 ++-
 extras/rya.export/export.client/conf/config.xml |   1 -
 .../rya/export/client/MergeDriverClient.java    |   3 +-
 .../client/conf/MergeConfigurationCLI.java      |  13 +-
 .../rya/export/client/conf/TimeUtils.java       |   4 +-
 .../client/conf/MergeConfigurationCLITest.java  |  56 ++
 .../export/mongo/MongoRyaStatementStore.java    |  11 +-
 .../accumulo/geo/GeoMesaGeoIndexer.java         |  12 +-
 .../accumulo/geo/GeoWaveGeoIndexer.java         |   7 +-
 .../accumulo/VisibilityBindingSetSerDe.java     |  23 +-
 .../accumulo/VisibilityBindingSetSerDeTest.java |  32 +-
 .../apache/rya/accumulo/mr/merge/CopyTool.java  |  20 +-
 .../apache/rya/accumulo/mr/merge/MergeTool.java |  12 +-
 .../mr/merge/util/AccumuloInstanceDriver.java   |  29 +-
 .../rya/accumulo/mr/merge/util/TimeUtils.java   |   5 +-
 .../rya/accumulo/mr/merge/CopyToolTest.java     |  40 +-
 .../rya/accumulo/mr/merge/RulesetCopyIT.java    |  23 +-
 .../pcj/fluo/app/AggregationResultUpdater.java  |  30 +-
 .../export/kafka/KafkaBindingSetExporter.java   |   7 +-
 .../fluo/app/query/FluoQueryMetadataDAO.java    |  20 +-
 .../rya.pcj.fluo/pcj.fluo.integration/pom.xml   |  32 +
 .../indexing/pcj/fluo/integration/QueryIT.java  |   2 +-
 .../src/test/resources/log4j.properties         |  21 +-
 .../rya/reasoning/mr/ConformanceTest.java       |  12 +-
 .../apache/rya/reasoning/mr/SchemaWritable.java |  32 +-
 .../org/apache/rya/reasoning/SchemaTest.java    |  64 +-
 .../rya/shell/RyaShellHistoryProvider.java      |   3 +-
 .../accumulo/mr/examples/TextOutputExample.java |  17 +-
 .../rya/accumulo/pig/AccumuloStorage.java       |  14 +-
 .../rya/accumulo/pig/IndexWritingTool.java      |   5 +-
 .../rya/accumulo/pig/SparqlQueryPigEngine.java  |  13 +-
 .../accumulo/pig/StatementPatternStorage.java   |   4 +-
 pom.xml                                         |   9 +-
 .../rya/rdftriplestore/RdfCloudTripleStore.java |  52 +-
 .../RdfCloudTripleStoreConnection.java          |  36 +-
 ...RdfCloudTripleStoreEvaluationStatistics.java | 144 +++--
 ...pleStoreSelectivityEvaluationStatistics.java |  48 +-
 .../inference/InferenceEngine.java              | 589 ++++++++++---------
 .../inference/PropertyChainVisitor.java         |   3 +
 .../namespace/NamespaceManager.java             |  22 +-
 web/web.rya/resources/environment.properties    |  27 -
 .../cloud/rdf/web/sail/RdfController.java       | 307 +++++-----
 web/web.rya/src/main/webapp/sparqlQuery.jsp     |  32 +-
 .../cloud/rdf/web/sail/RdfControllerTest.java   |  59 +-
 82 files changed, 1940 insertions(+), 990 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/common/rya.api/src/main/java/org/apache/rya/api/log/LogUtils.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/log/LogUtils.java b/common/rya.api/src/main/java/org/apache/rya/api/log/LogUtils.java
new file mode 100644
index 0000000..04bfdbb
--- /dev/null
+++ b/common/rya.api/src/main/java/org/apache/rya/api/log/LogUtils.java
@@ -0,0 +1,57 @@
+/*
+ * 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.log;
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+/**
+ * Utility methods for logging.
+ */
+public final class LogUtils {
+    /**
+     * Private constructor to prevent instantiation.
+     */
+    private LogUtils() {
+    }
+
+    /**
+     * Cleans the log message to prevent log forging. This will escape certain
+     * characters such as carriage returns and line feeds and will replace
+     * non-printable and other certain characters with their unicode value.<p>
+     * This will turn the following string (which contains a CRLF):<pre>
+     * ¿Hello
+     * World?!
+     * </pre>
+     * into the escaped message:<pre>
+     * \u00BFHello\r\nWorld?!
+     * </pre>
+     * @param message the message to clean.
+     * @return the cleansed message.
+     */
+    public static String clean(final String message) {
+        if (message != null) {
+            String clean = StringEscapeUtils.escapeJavaScript(message);
+            // Replace delete since the above escaping does not
+            clean = clean.replace("" + (char) 0x7F, "\\u007F");
+            return clean;
+        }
+
+        return message;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/common/rya.api/src/main/java/org/apache/rya/api/path/PathUtils.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/path/PathUtils.java b/common/rya.api/src/main/java/org/apache/rya/api/path/PathUtils.java
new file mode 100644
index 0000000..8f46977
--- /dev/null
+++ b/common/rya.api/src/main/java/org/apache/rya/api/path/PathUtils.java
@@ -0,0 +1,260 @@
+/*
+ * 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.path;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileSystem;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.UserPrincipal;
+import java.nio.file.attribute.UserPrincipalLookupService;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang.SystemUtils;
+import org.apache.hadoop.conf.Configuration;
+
+/**
+ * Utility methods for {@link Path}s.
+ */
+public final class PathUtils {
+    /**
+     * Private constructor to prevent instantiation.
+     */
+    private PathUtils() {
+    }
+
+    /**
+     * Cleans the path to prevent path manipulation. It performs the following:
+     * <ul>
+     * <li>Normalizes a path, removing double and single dot path steps.</li>
+     * </ul>
+     * @param path the path to clean.
+     * @return the cleansed path.
+     * @throws IllegalArgumentException if file is in a shared directory.
+     */
+    public static Path cleanPath(final Path path) {
+        if (path != null) {
+            final Path cleanPath = cleanPath(path.toString());
+            return cleanPath;
+        }
+        return null;
+    }
+
+    /**
+     * Cleans the path to prevent path manipulation. It performs the following:
+     * <ul>
+     * <li>Normalizes a path, removing double and single dot path steps.</li>
+     * </ul>
+     * @param filename the filename to clean.
+     * @return the cleansed path.
+     * @throws IllegalArgumentException if file is in a shared directory.
+     */
+    public static Path cleanPath(final String filename) {
+        if (filename != null) {
+            final Path cleanPath = Paths.get(clean(filename));
+            return cleanPath;
+        }
+        return null;
+    }
+
+    /**
+     * Cleans the path to prevent path manipulation. It performs the following:
+     * <ul>
+     *   <li>Normalizes a path, removing double and single dot path steps.</li>
+     *   <li>Ensures path is not in shared directory.</li>
+     * </ul>
+     * @param filename the filename to clean.
+     * @return the cleansed path.
+     * @throws IllegalArgumentException if file is in a shared directory.
+     * @throws IOException
+     */
+    public static org.apache.hadoop.fs.Path cleanHadoopPath(final org.apache.hadoop.fs.Path hadoopPath, final Configuration conf) throws IllegalArgumentException, IOException {
+        if (hadoopPath != null) {
+            final Path path = fromHadoopPath(hadoopPath, conf);
+            final Path clean = cleanPath(path);
+            return toHadoopPath(clean);
+        }
+        return null;
+    }
+
+    /**
+     * Cleans the path to prevent path manipulation. It performs the following:
+     * <ul>
+     *   <li>Normalizes a path, removing double and single dot path steps.</li>
+     *   <li>Ensures path is not in shared directory.</li>
+     * </ul>
+     * @param filename the filename to clean.
+     * @return the cleansed path.
+     * @throws IllegalArgumentException if file is in a shared directory.
+     */
+    public static String clean(final String filename) throws IllegalArgumentException {
+        if (filename != null) {
+            final String clean = FilenameUtils.normalize(filename);
+            if (!isInSecureDir(clean)) {
+                throw new IllegalArgumentException("Operation of a file in a shared directory is not allowed: " + filename);
+            }
+            return clean;
+        }
+        return null;
+    }
+
+    /**
+     * Indicates whether file lives in a secure directory relative to the
+     * program's user.
+     * @param filename the filename to test.
+     * @return {@code true} if file's directory is secure.
+     */
+    public static boolean isInSecureDir(final String filename) {
+        final Path path = filename != null ? Paths.get(filename) : null;
+        return isInSecureDir(path, null);
+    }
+
+    /**
+     * Indicates whether file lives in a secure directory relative to the
+     * program's user.
+     * @param file {@link Path} to test.
+     * @return {@code true} if file's directory is secure.
+     */
+    public static boolean isInSecureDir(final Path file) {
+        return isInSecureDir(file, null);
+    }
+
+    /**
+     * Indicates whether file lives in a secure directory relative to the
+     * program's user.
+     * @param file {@link Path} to test.
+     * @param user {@link UserPrincipal} to test. If {@code null}, defaults to
+     * current user
+     * @return {@code true} if file's directory is secure.
+     */
+    public static boolean isInSecureDir(final Path file, final UserPrincipal user) {
+        return isInSecureDir(file, user, 5);
+    }
+
+    /**
+     * Indicates whether file lives in a secure directory relative to the
+     * program's user.
+     * @param file {@link Path} to test.
+     * @param user {@link UserPrincipal} to test. If {@code null}, defaults to
+     * current user.
+     * @param symlinkDepth Number of symbolic links allowed.
+     * @return {@code true} if file's directory is secure.
+     */
+    public static boolean isInSecureDir(Path file, UserPrincipal user, final int symlinkDepth) {
+        if (!file.isAbsolute()) {
+            file = file.toAbsolutePath();
+        }
+        if (symlinkDepth <= 0) {
+            // Too many levels of symbolic links
+            return false;
+        }
+        // Get UserPrincipal for specified user and superuser
+        final Path fileRoot = file.getRoot();
+        if (fileRoot == null) {
+            return false;
+        }
+        final FileSystem fileSystem = Paths.get(fileRoot.toString()).getFileSystem();
+        final UserPrincipalLookupService upls = fileSystem.getUserPrincipalLookupService();
+        UserPrincipal root = null;
+        try {
+            if (SystemUtils.IS_OS_UNIX) {
+                root = upls.lookupPrincipalByName("root");
+            } else {
+                root = upls.lookupPrincipalByName("Administrators");
+            }
+            if (user == null) {
+                user = upls.lookupPrincipalByName(System.getProperty("user.name"));
+            }
+            if (root == null || user == null) {
+                return false;
+            }
+        } catch (final IOException x) {
+            return false;
+        }
+        // If any parent dirs (from root on down) are not secure, dir is not secure
+        for (int i = 1; i <= file.getNameCount(); i++) {
+            final Path partialPath = Paths.get(fileRoot.toString(), file.subpath(0, i).toString());
+            try {
+                if (Files.isSymbolicLink(partialPath)) {
+                    if (!isInSecureDir(Files.readSymbolicLink(partialPath), user, symlinkDepth - 1)) {
+                        // Symbolic link, linked-to dir not secure
+                        return false;
+                    }
+                } else {
+                    final UserPrincipal owner = Files.getOwner(partialPath);
+                    if (!user.equals(owner) && !root.equals(owner)) {
+                        // dir owned by someone else, not secure
+                        return false;
+                    }
+                }
+            } catch (final IOException x) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Converts a path string to a {@link org.apache.hadoop.fs.Path}.
+     * @param filename The path string
+     * @return the resulting {@link org.apache.hadoop.fs.Path}.
+     */
+    public static org.apache.hadoop.fs.Path toHadoopPath(final String filename) {
+        if (filename != null) {
+            final Path path = Paths.get(filename);
+            return toHadoopPath(path);
+        }
+        return null;
+    }
+
+    /**
+     * Converts a {@link Path} to a {@link org.apache.hadoop.fs.Path}.
+     * @param path The {@link Path}.
+     * @return the resulting {@link org.apache.hadoop.fs.Path}.
+     */
+    public static org.apache.hadoop.fs.Path toHadoopPath(final Path path) {
+        if (path != null) {
+            final String stringPath = FilenameUtils.separatorsToUnix(path.toAbsolutePath().toString());
+            final org.apache.hadoop.fs.Path hadoopPath = new org.apache.hadoop.fs.Path(stringPath);
+            return hadoopPath;
+        }
+        return null;
+    }
+
+    /**
+     * Converts a {@link org.apache.hadoop.fs.Path} to a {@link Path}.
+     * @param hadoopPath The {@link org.apache.hadoop.fs.Path}.
+     * @param conf the {@link Configuration}.
+     * @return the resulting {@link org.apache.hadoop.fs.Path}.
+     */
+    public static Path fromHadoopPath(final org.apache.hadoop.fs.Path hadoopPath, final Configuration conf) throws IOException {
+        if (hadoopPath != null) {
+            final org.apache.hadoop.fs.FileSystem fs = org.apache.hadoop.fs.FileSystem.get(hadoopPath.toUri(), conf);
+            final File tempFile = File.createTempFile(hadoopPath.getName(), "");
+            tempFile.deleteOnExit();
+            fs.copyToLocalFile(hadoopPath, new org.apache.hadoop.fs.Path(tempFile.getAbsolutePath()));
+            return tempFile.toPath();
+        }
+        return null;
+    }
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/common/rya.api/src/main/java/org/apache/rya/api/utils/XmlFactoryConfiguration.java
----------------------------------------------------------------------
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/XmlFactoryConfiguration.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/XmlFactoryConfiguration.java
new file mode 100644
index 0000000..2594ef0
--- /dev/null
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/XmlFactoryConfiguration.java
@@ -0,0 +1,115 @@
+/*
+ * 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.utils;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.stream.XMLInputFactory;
+
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+
+/**
+ * This class configures XML Factories to protect against XML External Entity (XXE) attack. Configurations based on
+ * information from: https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
+ */
+public class XmlFactoryConfiguration {
+
+    /**
+     * Hardens the provided factory to protect against an XML External Entity (XXE) attack.
+     *
+     * @param factory - The factory to be modified.
+     */
+    public static void harden(final XMLInputFactory factory) {
+        // From: https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
+        // To protect a Java XMLInputFactory from XXE, do this:
+        factory.setProperty(XMLInputFactory.SUPPORT_DTD, false); // This disables DTDs entirely for that factory
+        factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false); // disable external entities
+    }
+
+    /**
+     * Hardens the provided factory to protect against an XML External Entity (XXE) attack.
+     *
+     * @param factory - The factory to be modified.
+     * @throws SAXNotRecognizedException
+     * @throws SAXNotSupportedException
+     * @throws ParserConfigurationException
+     */
+    public static void harden(final SAXParserFactory factory)
+            throws SAXNotRecognizedException, SAXNotSupportedException, ParserConfigurationException {
+        // From: https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
+        // To protect a Java SAXParserFactory from XXE, do this:
+
+        // This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all XML entity attacks are prevented
+        factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+
+        // If you can't completely disable DTDs, then at least do the following:
+        // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
+        // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
+        // JDK7+ - http://xml.org/sax/features/external-general-entities
+        factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
+
+        // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
+        // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
+        // JDK7+ - http://xml.org/sax/features/external-parameter-entities
+        factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+
+        // Disable external DTDs as well
+        factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+
+        // and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks" (see reference
+        // below)
+        factory.setXIncludeAware(false);
+    }
+
+    /**
+     * Hardens the provided factory to protect against an XML External Entity (XXE) attack.
+     *
+     * @param factory - The factory to be modified.
+     * @throws ParserConfigurationException
+     */
+    public static void harden(final DocumentBuilderFactory factory) throws ParserConfigurationException {
+        // From: https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
+        // To protect a Java DocumentBuilderFactory from XXE, do this:
+
+        // This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all XML entity attacks are prevented
+        factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+
+        // If you can't completely disable DTDs, then at least do the following:
+        // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
+        // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
+        // JDK7+ - http://xml.org/sax/features/external-general-entities
+        factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
+
+        // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
+        // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
+        // JDK7+ - http://xml.org/sax/features/external-parameter-entities
+        factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+
+        // Disable external DTDs as well
+        factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+
+        // and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks" (see reference
+        // below)
+        factory.setXIncludeAware(false);
+        factory.setExpandEntityReferences(false);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/dao/accumulo.rya/pom.xml
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/pom.xml b/dao/accumulo.rya/pom.xml
index 5ca7605..ae8453c 100644
--- a/dao/accumulo.rya/pom.xml
+++ b/dao/accumulo.rya/pom.xml
@@ -54,7 +54,10 @@ under the License.
             <groupId>org.openrdf.sesame</groupId>
             <artifactId>sesame-queryalgebra-evaluation</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            </dependency>
         <!--  testing dependencies -->
         <dependency>
             <groupId>org.openrdf.sesame</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java
index f47b4b3..a8ed76c 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java
@@ -28,11 +28,10 @@ import static org.apache.rya.api.RdfCloudTripleStoreConstants.SUBJECTPRED_CF_TXT
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.SUBJECT_CF_TXT;
 
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.Scanner;
@@ -41,7 +40,6 @@ import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.io.Text;
-import org.apache.rya.api.RdfCloudTripleStoreStatement;
 import org.apache.rya.api.layout.TableLayoutStrategy;
 import org.apache.rya.api.persist.RdfDAOException;
 import org.apache.rya.api.persist.RdfEvalStatsDAO;
@@ -55,10 +53,9 @@ import org.openrdf.model.Value;
  */
 public class AccumuloRdfEvalStatsDAO implements RdfEvalStatsDAO<AccumuloRdfConfiguration> {
 
-    private boolean initialized = false;
+    private final AtomicBoolean isInitialized = new AtomicBoolean();
     private AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
 
-    private final Collection<RdfCloudTripleStoreStatement> statements = new ArrayList<RdfCloudTripleStoreStatement>();
     private Connector connector;
 
     //    private String evalTable = TBL_EVAL;
@@ -80,7 +77,7 @@ public class AccumuloRdfEvalStatsDAO implements RdfEvalStatsDAO<AccumuloRdfConfi
 //            boolean tableExists = tos.exists(evalTable);
 //            if (!tableExists)
 //                tos.create(evalTable);
-            initialized = true;
+            isInitialized.set(true);
         } catch (final Exception e) {
             throw new RdfDAOException(e);
         }
@@ -92,12 +89,12 @@ public class AccumuloRdfEvalStatsDAO implements RdfEvalStatsDAO<AccumuloRdfConfi
         if (!isInitialized()) {
             throw new IllegalStateException("Not initialized");
         }
-        initialized = false;
+        isInitialized.set(false);
     }
 
     @Override
     public boolean isInitialized() throws RdfDAOException {
-        return initialized;
+        return isInitialized.get();
     }
 
     public Connector getConnector() {
@@ -120,7 +117,7 @@ public class AccumuloRdfEvalStatsDAO implements RdfEvalStatsDAO<AccumuloRdfConfi
 
     @Override
     public double getCardinality(final AccumuloRdfConfiguration conf,
-            final org.apache.rya.api.persist.RdfEvalStatsDAO.CARDINALITY_OF card, final List<Value> val,
+            final RdfEvalStatsDAO.CARDINALITY_OF card, final List<Value> val,
             final Resource context) throws RdfDAOException {
         try {
             final Authorizations authorizations = conf.getAuthorizations();
@@ -150,7 +147,7 @@ public class AccumuloRdfEvalStatsDAO implements RdfEvalStatsDAO<AccumuloRdfConfi
             final Iterator<Value> vals = val.iterator();
             String compositeIndex = vals.next().stringValue();
             while (vals.hasNext()){
-            	compositeIndex += DELIM + vals.next().stringValue();
+                compositeIndex += DELIM + vals.next().stringValue();
             }
             scanner.setRange(new Range(new Text(compositeIndex.getBytes(StandardCharsets.UTF_8))));
             final Iterator<Map.Entry<Key, org.apache.accumulo.core.data.Value>> iter = scanner.iterator();
@@ -167,7 +164,7 @@ public class AccumuloRdfEvalStatsDAO implements RdfEvalStatsDAO<AccumuloRdfConfi
 
     @Override
     public double getCardinality(final AccumuloRdfConfiguration conf,
-            final org.apache.rya.api.persist.RdfEvalStatsDAO.CARDINALITY_OF card, final List<Value> val)
+            final RdfEvalStatsDAO.CARDINALITY_OF card, final List<Value> val)
             throws RdfDAOException {
         return getCardinality(conf, card, val, null);
     }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java
index a8350d9..22d6dc9 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java
@@ -37,6 +37,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
@@ -78,8 +79,8 @@ import info.aduna.iteration.CloseableIteration;
 public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaNamespaceManager<AccumuloRdfConfiguration> {
     private static final Log logger = LogFactory.getLog(AccumuloRyaDAO.class);
 
-    private boolean initialized = false;
-    private boolean flushEachUpdate = true;
+    private final AtomicBoolean isInitialized = new AtomicBoolean();
+    private final AtomicBoolean flushEachUpdate = new AtomicBoolean(true);
     private Connector connector;
     private BatchWriterConfig batchWriterConfig;
 
@@ -102,12 +103,12 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
 
     @Override
     public boolean isInitialized() throws RyaDAOException {
-        return initialized;
+        return isInitialized.get();
     }
 
     @Override
     public void init() throws RyaDAOException {
-        if (initialized) {
+        if (isInitialized.get()) {
             return;
         }
         try {
@@ -127,7 +128,7 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
 
             secondaryIndexers = conf.getAdditionalIndexers();
 
-            flushEachUpdate = conf.flushEachUpdate();
+            flushEachUpdate.set(conf.flushEachUpdate());
 
             final TableOperations tableOperations = connector.tableOperations();
             AccumuloRdfUtils.createTableIfNotExist(tableOperations, tableLayoutStrategy.getSpo());
@@ -158,14 +159,14 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
 
             checkVersion();
 
-            initialized = true;
+            isInitialized.set(true);
         } catch (final Exception e) {
             throw new RyaDAOException(e);
         }
     }
 
     @Override
-	public String getVersion() throws RyaDAOException {
+    public String getVersion() throws RyaDAOException {
         String version = null;
         final CloseableIteration<RyaStatement, RyaDAOException> versIter = queryEngine.query(new RyaStatement(RTS_SUBJECT_RYA, RTS_VERSION_PREDICATE_RYA, null), conf);
         if (versIter.hasNext()) {
@@ -206,7 +207,9 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
                     index.deleteStatement(stmt);
                 }
             }
-            if (flushEachUpdate) { mt_bw.flush(); }
+            if (flushEachUpdate.get()) {
+                mt_bw.flush();
+            }
         } catch (final Exception e) {
             throw new RyaDAOException(e);
         }
@@ -284,7 +287,9 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
                 }
             }
 
-            if (flushEachUpdate) { mt_bw.flush(); }
+            if (flushEachUpdate.get()) {
+                mt_bw.flush();
+            }
         } catch (final Exception e) {
             throw new RyaDAOException(e);
         }
@@ -292,12 +297,12 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
 
     @Override
     public void destroy() throws RyaDAOException {
-        if (!initialized) {
+        if (!isInitialized.get()) {
             return;
         }
         //TODO: write lock
         try {
-            initialized = false;
+            isInitialized.set(false);
             mt_bw.flush();
 
             mt_bw.close();
@@ -319,7 +324,9 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
             final Mutation m = new Mutation(new Text(pfx));
             m.put(INFO_NAMESPACE_TXT, EMPTY_TEXT, new Value(namespace.getBytes(StandardCharsets.UTF_8)));
             bw_ns.addMutation(m);
-            if (flushEachUpdate) { mt_bw.flush(); }
+            if (flushEachUpdate.get()) {
+                mt_bw.flush();
+            }
         } catch (final Exception e) {
             throw new RyaDAOException(e);
         }
@@ -350,7 +357,9 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
             final Mutation del = new Mutation(new Text(pfx));
             del.putDelete(INFO_NAMESPACE_TXT, EMPTY_TEXT);
             bw_ns.addMutation(del);
-            if (flushEachUpdate) { mt_bw.flush(); }
+            if (flushEachUpdate.get()) {
+                mt_bw.flush();
+            }
         } catch (final Exception e) {
             throw new RyaDAOException(e);
         }
@@ -400,7 +409,9 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
     public void dropAndDestroy() throws RyaDAOException {
         for (final String tableName : getTables()) {
             try {
-                drop(tableName);
+                if (tableName != null) {
+                    drop(tableName);
+                }
             } catch (final AccumuloSecurityException e) {
                 logger.error(e.getMessage());
                 throw new RyaDAOException(e);
@@ -421,11 +432,11 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
         }
     }
 
-    public Connector getConnector() {
+    public synchronized Connector getConnector() {
         return connector;
     }
 
-    public void setConnector(final Connector connector) {
+    public synchronized void setConnector(final Connector connector) {
         this.connector = connector;
     }
 
@@ -438,16 +449,16 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
     }
 
     protected MultiTableBatchWriter getMultiTableBatchWriter(){
-    	return mt_bw;
+        return mt_bw;
     }
 
     @Override
-	public AccumuloRdfConfiguration getConf() {
+    public synchronized AccumuloRdfConfiguration getConf() {
         return conf;
     }
 
     @Override
-	public void setConf(final AccumuloRdfConfiguration conf) {
+    public synchronized void setConf(final AccumuloRdfConfiguration conf) {
         this.conf = conf;
     }
 
@@ -460,7 +471,7 @@ public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaName
     }
 
     @Override
-	public AccumuloRyaQueryEngine getQueryEngine() {
+    public AccumuloRyaQueryEngine getQueryEngine() {
         return queryEngine;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/RyaDetailsSerializer.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/RyaDetailsSerializer.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/RyaDetailsSerializer.java
index 97ebb5b..b0dedb2 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/RyaDetailsSerializer.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/instance/RyaDetailsSerializer.java
@@ -24,15 +24,16 @@ import static java.util.Objects.requireNonNull;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.regex.Pattern;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
+import org.apache.commons.io.serialization.ValidatingObjectInputStream;
 import org.apache.rya.api.instance.RyaDetails;
 import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
 
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
 /**
  * Serializes {@link RyaDetails} instances.
  */
@@ -66,15 +67,32 @@ public class RyaDetailsSerializer {
     public RyaDetails deserialize(final byte[] bytes) throws SerializationException {
         requireNonNull(bytes);
 
-        try {
-            final ByteArrayInputStream stream = new ByteArrayInputStream( bytes );
-            final Object o = new ObjectInputStream( stream ).readObject();
+        try (final ByteArrayInputStream stream = new ByteArrayInputStream(bytes); //
+                        final ValidatingObjectInputStream vois = new ValidatingObjectInputStream(stream)
+        //// this is how you find classes that you missed in the accept list
+        // { @Override protected void invalidClassNameFound(String className) throws java.io.InvalidClassException {
+        // System.out.println("vois.accept(" + className + ".class, ");};};
+        ) {
+            vois.accept(RyaDetails.class,
+                            com.google.common.base.Optional.class, //
+                            java.util.Date.class, //
+                            java.lang.Enum.class);
+            vois.accept("com.google.common.base.Present", //
+                        "com.google.common.base.Absent", //
+                        "com.google.common.collect.ImmutableMap$SerializedForm", //
+                        "com.google.common.collect.ImmutableBiMap$SerializedForm", //
+                        "com.google.common.collect.ImmutableList$SerializedForm", //
+                        "[Ljava.lang.Object;");
+            vois.accept(Pattern.compile("org\\.apache\\.rya\\.api\\.instance\\.RyaDetails.*"));
 
-            if(! (o instanceof RyaDetails) ) {
-                throw new SerializationException("Wrong type of object was deserialized. Class: " + o.getClass().getName() );
+            final Object o = vois.readObject();
+
+            if (!(o instanceof RyaDetails)) {
+                throw new SerializationException("Wrong type of object was deserialized. Class: " + o.getClass().getName());
             }
 
             return (RyaDetails) o;
+
         } catch (final ClassNotFoundException | IOException e) {
             throw new SerializationException("Could not deserialize an instance of RyaDetails.", e);
         }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java
----------------------------------------------------------------------
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java
index 888d896..d89928c 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java
@@ -20,7 +20,6 @@ package org.apache.rya.accumulo.query;
  */
 
 import static org.apache.rya.api.RdfCloudTripleStoreUtils.layoutToTable;
-import info.aduna.iteration.CloseableIteration;
 
 import java.io.IOException;
 import java.util.Collection;
@@ -29,11 +28,23 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 
+import org.apache.accumulo.core.client.BatchScanner;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.IteratorSetting;
+import org.apache.accumulo.core.client.Scanner;
+import org.apache.accumulo.core.client.ScannerBase;
+import org.apache.accumulo.core.data.Column;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Range;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.iterators.user.RegExFilter;
+import org.apache.accumulo.core.iterators.user.TimestampFilter;
+import org.apache.accumulo.core.security.Authorizations;
+import org.apache.hadoop.io.Text;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
-import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.domain.RyaRange;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
@@ -49,20 +60,6 @@ import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.api.resolver.triple.TripleRowRegex;
 import org.apache.rya.api.utils.CloseableIterableIteration;
-
-import org.apache.accumulo.core.client.BatchScanner;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.IteratorSetting;
-import org.apache.accumulo.core.client.Scanner;
-import org.apache.accumulo.core.client.ScannerBase;
-import org.apache.accumulo.core.data.Column;
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Range;
-import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.iterators.user.RegExFilter;
-import org.apache.accumulo.core.iterators.user.TimestampFilter;
-import org.apache.accumulo.core.security.Authorizations;
-import org.apache.hadoop.io.Text;
 import org.calrissian.mango.collect.CloseableIterable;
 import org.calrissian.mango.collect.CloseableIterables;
 import org.calrissian.mango.collect.FluentCloseableIterable;
@@ -73,6 +70,8 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Iterators;
 
+import info.aduna.iteration.CloseableIteration;
+
 /**
  * Date: 7/17/12 Time: 9:28 AM
  */
@@ -195,9 +194,10 @@ public class AccumuloRyaQueryEngine implements RyaQueryEngine<AccumuloRdfConfigu
                 ranges.add(range);
                 rangeMap.put(rangeMapRange, bs);
             }
-            // no ranges
-            if (layout == null)
+            // no ranges. if strategy alone is null, it would be thrown in the loop above.
+            if (layout == null || strategy == null) {
                 return null;
+            }
             String regexSubject = conf.getRegexSubject();
             String regexPredicate = conf.getRegexPredicate();
             String regexObject = conf.getRegexObject();
@@ -368,8 +368,8 @@ public class AccumuloRyaQueryEngine implements RyaQueryEngine<AccumuloRdfConfigu
                 ranges.add(range);
             }
             // no ranges
-            if (layout == null)
-                throw new IllegalArgumentException("No table layout specified");
+            if (layout == null || strategy == null)
+                throw new IllegalArgumentException("No table layout specified, or no statements.");
 
             final TripleRowRegex tripleRowRegex = strategy.buildRegex(regexSubject, regexPredicate, regexObject, null, null);
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRyaDAO.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRyaDAO.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRyaDAO.java
index 4da36d5..75e33d1 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRyaDAO.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRyaDAO.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.commons.io.IOUtils;
@@ -59,8 +60,8 @@ import com.mongodb.MongoClient;
 public final class MongoDBRyaDAO implements RyaDAO<StatefulMongoDBRdfConfiguration>{
     private static final Logger log = Logger.getLogger(MongoDBRyaDAO.class);
 
-    private boolean isInitialized = false;
-    private boolean flushEachUpdate = true;
+    private final AtomicBoolean isInitialized = new AtomicBoolean();
+    private final AtomicBoolean flushEachUpdate = new AtomicBoolean(true);
     private StatefulMongoDBRdfConfiguration conf;
     private MongoClient mongoClient;
     private DB db;
@@ -75,13 +76,14 @@ public final class MongoDBRyaDAO implements RyaDAO<StatefulMongoDBRdfConfigurati
     private MongoDbBatchWriter<DBObject> mongoDbBatchWriter;
 
     @Override
-    public void setConf(final StatefulMongoDBRdfConfiguration conf) {
+    public synchronized void setConf(final StatefulMongoDBRdfConfiguration conf) {
         this.conf = requireNonNull(conf);
         mongoClient = this.conf.getMongoClient();
         auths = conf.getAuthorizations();
-        flushEachUpdate = conf.flushEachUpdate();
+        flushEachUpdate.set(conf.flushEachUpdate());
     }
-
+  
+    
     public void setDB(final DB db) {
         this.db = db;
     }
@@ -91,13 +93,13 @@ public final class MongoDBRyaDAO implements RyaDAO<StatefulMongoDBRdfConfigurati
     }
 
     @Override
-    public StatefulMongoDBRdfConfiguration getConf() {
+    public synchronized StatefulMongoDBRdfConfiguration getConf() {
         return conf;
     }
 
     @Override
     public void init() throws RyaDAOException {
-        if (isInitialized) {
+        if (isInitialized.get()) {
             return;
         }
         secondaryIndexers = conf.getAdditionalIndexers();
@@ -123,20 +125,20 @@ public final class MongoDBRyaDAO implements RyaDAO<StatefulMongoDBRdfConfigurati
         } catch (final MongoDbBatchWriterException e) {
             throw new RyaDAOException("Error starting MongoDB batch writer", e);
         }
-        isInitialized = true;
+        isInitialized.set(true);
     }
 
     @Override
     public boolean isInitialized() throws RyaDAOException {
-        return isInitialized;
+        return isInitialized.get();
     }
 
     @Override
     public void destroy() throws RyaDAOException {
-        if (!isInitialized) {
+        if (!isInitialized.get()) {
             return;
         }
-        isInitialized = false;
+        isInitialized.set(false);
         flush();
         try {
             mongoDbBatchWriter.shutdown();
@@ -166,7 +168,7 @@ public final class MongoDBRyaDAO implements RyaDAO<StatefulMongoDBRdfConfigurati
                 final DBObject obj = storageStrategy.serialize(statement);
                 try {
                     mongoDbBatchWriter.addObjectToQueue(obj);
-                    if (flushEachUpdate) {
+                    if (flushEachUpdate.get()) {
                         flush();
                     }
                 } catch (final MongoDbBatchWriterException e) {
@@ -210,7 +212,7 @@ public final class MongoDBRyaDAO implements RyaDAO<StatefulMongoDBRdfConfigurati
         }
         try {
             mongoDbBatchWriter.addObjectsToQueue(dbInserts);
-            if (flushEachUpdate) {
+            if (flushEachUpdate.get()) {
                 flush();
             }
         } catch (final MongoDbBatchWriterException e) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
index 388e807..db33181 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
@@ -118,7 +118,7 @@ public class SimpleMongoDBStorageStrategy implements MongoDBStorageStrategy<RyaS
         try {
             documentVisibility = DocumentVisibilityAdapter.toDocumentVisibility(queryResult);
         } catch (final MalformedDocumentVisibilityException e) {
-            LOG.error("Unable to convert document visibility");
+            throw new RuntimeException("Unable to convert document visibility", e);
         }
         final Long timestamp = (Long) result.get(TIMESTAMP);
         final String statementMetadata = (String) result.get(STATEMENT_METADATA);

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRdfConfigurationTest.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRdfConfigurationTest.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRdfConfigurationTest.java
index 948c3d5..c53c9f2 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRdfConfigurationTest.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRdfConfigurationTest.java
@@ -99,4 +99,5 @@ public class MongoDBRdfConfigurationTest {
         assertEquals(conf.get(MongoDBRdfConfiguration.MONGO_USER), user);
         assertEquals(conf.get(MongoDBRdfConfiguration.MONGO_USER_PASSWORD), password);
     }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java
index 76aad02..3fe0cb1 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java
@@ -201,7 +201,7 @@ public class AccumuloBatchUpdatePCJ extends AccumuloCommand implements BatchUpda
             final AccumuloRdfConfiguration ryaConf = new AccumuloRdfConfiguration();
             ryaConf.setTablePrefix(ryaInstanceName);
             ryaConf.set(ConfigUtils.CLOUDBASE_USER, connectionDetails.getUsername());
-            ryaConf.set(ConfigUtils.CLOUDBASE_PASSWORD, new String(connectionDetails.getPassword()));
+            ryaConf.set(ConfigUtils.CLOUDBASE_PASSWORD, new String(connectionDetails.getUserPass()));
             ryaConf.set(ConfigUtils.CLOUDBASE_ZOOKEEPERS, connectionDetails.getZookeepers());
             ryaConf.set(ConfigUtils.CLOUDBASE_INSTANCE, connectionDetails.getInstanceName());
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java
index c0759c4..c31490f 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloConnectionDetails.java
@@ -33,7 +33,7 @@ import net.jcip.annotations.Immutable;
 @DefaultAnnotation(NonNull.class)
 public class AccumuloConnectionDetails {
     private final String username;
-    private final char[] password;
+    private final char[] userpass;
     private final String instanceName;
     private final String zookeepers;
 
@@ -41,7 +41,7 @@ public class AccumuloConnectionDetails {
      * Constructs an instance of {@link AccumuloConnectionDetails}.
      *
      * @param username - The username that was used to establish the connection. (not null)
-     * @param password - The password that was used to establish the connection. (not null)
+     * @param userpass - The userpass that was used to establish the connection. (not null)
      * @param instanceName - The Accumulo instance name that was used to establish the connection. (not null)
      * @param zookeepers - The list of zookeeper hostname that were used to establish the connection. (not null)
      */
@@ -51,7 +51,7 @@ public class AccumuloConnectionDetails {
             final String instanceName,
             final String zookeepers) {
         this.username = requireNonNull(username);
-        this.password = requireNonNull(password);
+        this.userpass = requireNonNull(password);
         this.instanceName = requireNonNull(instanceName);
         this.zookeepers = requireNonNull(zookeepers);
     }
@@ -66,8 +66,8 @@ public class AccumuloConnectionDetails {
     /**
      * @return The password that was used to establish the connection.
      */
-    public char[] getPassword() {
-        return password;
+    public char[] getUserPass() {
+        return userpass;
     }
 
     /**
@@ -99,7 +99,7 @@ public class AccumuloConnectionDetails {
                 conf.setAccumuloZookeepers(zookeepers);
                 conf.setAccumuloInstance(instanceName);
                 conf.setAccumuloUser(username);
-                conf.setAccumuloPassword(new String(password));
+                conf.setAccumuloPassword(new String(userpass));
         return conf;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java
index 6aef33c..9ac7c2a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java
@@ -157,7 +157,7 @@ public class AccumuloCreatePCJ extends AccumuloCommand implements CreatePCJ {
         final AccumuloConnectionDetails cd = super.getAccumuloConnectionDetails();
         try(final FluoClient fluoClient = new FluoClientFactory().connect(
                 cd.getUsername(),
-                new String(cd.getPassword()),
+                new String(cd.getUserPass()),
                 cd.getInstanceName(),
                 cd.getZookeepers(),
                 fluoAppName);) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java
index 26a25da..3ecb93e 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java
@@ -122,7 +122,7 @@ public class AccumuloCreatePeriodicPCJ extends AccumuloCommand implements Create
         final AccumuloConnectionDetails cd = super.getAccumuloConnectionDetails();
         try(final FluoClient fluoClient = new FluoClientFactory().connect(
                 cd.getUsername(),
-                new String(cd.getPassword()),
+                new String(cd.getUserPass()),
                 cd.getInstanceName(),
                 cd.getZookeepers(),
                 fluoAppName);) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJ.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJ.java
index 547254d..309e27e 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJ.java
@@ -118,7 +118,7 @@ public class AccumuloDeletePCJ extends AccumuloCommand implements DeletePCJ {
         final AccumuloConnectionDetails cd = super.getAccumuloConnectionDetails();
         try(final FluoClient fluoClient = new FluoClientFactory().connect(
                 cd.getUsername(),
-                new String(cd.getPassword()),
+                new String(cd.getUserPass()),
                 cd.getInstanceName(),
                 cd.getZookeepers(),
                 fluoAppName)) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java
index 18e49dc..d287af4 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java
@@ -110,7 +110,7 @@ public class AccumuloDeletePeriodicPCJ extends AccumuloCommand implements Delete
 
         // Connect to the Fluo application that is updating this instance's PCJs.
         final AccumuloConnectionDetails cd = super.getAccumuloConnectionDetails();
-        try (final FluoClient fluoClient = new FluoClientFactory().connect(cd.getUsername(), new String(cd.getPassword()),
+        try (final FluoClient fluoClient = new FluoClientFactory().connect(cd.getUsername(), new String(cd.getUserPass()),
                 cd.getInstanceName(), cd.getZookeepers(), fluoAppName)) {
             // Delete the PCJ from the Fluo App.
             PeriodicQueryResultStorage periodic = new AccumuloPeriodicQueryResultStorage(getConnector(), ryaInstance);

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/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 65661d2..e5a8f50 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
@@ -217,7 +217,7 @@ public class AccumuloInstall extends AccumuloCommand implements Install {
         //     indexers used the connector that is provided to them instead of
         //     building a new one.
         conf.set(ConfigUtils.CLOUDBASE_USER, connectionDetails.getUsername());
-        conf.set(ConfigUtils.CLOUDBASE_PASSWORD, new String(connectionDetails.getPassword()));
+        conf.set(ConfigUtils.CLOUDBASE_PASSWORD, new String(connectionDetails.getUserPass()));
         conf.set(ConfigUtils.CLOUDBASE_INSTANCE, connectionDetails.getInstanceName());
         conf.set(ConfigUtils.CLOUDBASE_ZOOKEEPERS, connectionDetails.getZookeepers());
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloListIncrementalQueries.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloListIncrementalQueries.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloListIncrementalQueries.java
index 51e7d6a..378b4f0 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloListIncrementalQueries.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloListIncrementalQueries.java
@@ -87,7 +87,7 @@ public class AccumuloListIncrementalQueries extends AccumuloCommand implements L
         final AccumuloConnectionDetails cd = super.getAccumuloConnectionDetails();
         try(final FluoClient fluoClient = new FluoClientFactory().connect(
                 cd.getUsername(),
-                new String(cd.getPassword()),
+                new String(cd.getUserPass()),
                 cd.getInstanceName(),
                 cd.getZookeepers(),
                 fluoAppName);) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloUninstall.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloUninstall.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloUninstall.java
index 96de16c..9c2639b 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloUninstall.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloUninstall.java
@@ -34,6 +34,7 @@ import org.apache.rya.api.client.InstanceExists;
 import org.apache.rya.api.client.RyaClientException;
 import org.apache.rya.api.client.Uninstall;
 import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
+import org.apache.rya.api.log.LogUtils;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
@@ -81,8 +82,9 @@ public class AccumuloUninstall extends AccumuloCommand implements Uninstall {
                 try {
                     tableOps.delete(table);
                 } catch(final TableNotFoundException e) {
-                    log.warn("Uninstall could not delete table named '" + table + "' because it does not exist. " +
-                            "Something else is also deleting tables.");
+                    log.warn("Uninstall could not delete table named '" + LogUtils.clean(table)
+                                    + "' because it does not exist. "
+                                    + "Something else is also deleting tables.");
                 }
             }
         } catch (PCJStorageException | RyaDetailsRepositoryException e) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java
index bd46872..5683de5 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java
@@ -26,7 +26,6 @@ import java.util.NoSuchElementException;
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.pcj.matching.QueryVariableNormalizer;
-
 import org.openrdf.query.algebra.Projection;
 import org.openrdf.query.algebra.TupleExpr;
 
@@ -107,13 +106,13 @@ public class IndexedExecutionPlanGenerator implements ExternalIndexMatcher {
 
         ExternalTupleSet tempIndex;
         final List<ExternalTupleSet> normalizedIndexSet = Lists.newArrayList();
-
         for (final ExternalTupleSet e : indexSet) {
             List<TupleExpr> tupList = null;
             try {
                 tupList = QueryVariableNormalizer.getNormalizedIndex(query, e.getTupleExpr());
             } catch (final Exception e1) {
                 e1.printStackTrace();
+                throw new Error(e1);
             }
 
             for (final TupleExpr te : tupList) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java
index 25a272d..c87b240 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java
@@ -71,6 +71,8 @@ import com.google.common.primitives.Bytes;
 
 import info.aduna.iteration.CloseableIteration;
 
+import info.aduna.iteration.CloseableIteration;
+
 public class AccumuloDocIdIndexer implements DocIdIndexer {
 
 
@@ -96,6 +98,7 @@ public class AccumuloDocIdIndexer implements DocIdIndexer {
             pq1 = parser.parseQuery(sparqlQuery, null);
         } catch (final MalformedQueryException e) {
             e.printStackTrace();
+            throw new QueryEvaluationException("Malformed query. query=" + sparqlQuery, e);
         }
 
         final TupleExpr te1 = pq1.getTupleExpr();

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityLocalityGroupSetter.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityLocalityGroupSetter.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityLocalityGroupSetter.java
index 60d1740..c321954 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityLocalityGroupSetter.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityLocalityGroupSetter.java
@@ -27,7 +27,7 @@ import java.util.Iterator;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.apache.rya.indexing.accumulo.ConfigUtils;
+
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.BatchScanner;
@@ -39,6 +39,7 @@ import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
+import org.apache.rya.indexing.accumulo.ConfigUtils;
 
 public class EntityLocalityGroupSetter {
 
@@ -63,6 +64,7 @@ public class EntityLocalityGroupSetter {
             bs = conn.createBatchScanner(tablePrefix + "prospects", new Authorizations(auths), 10);
         } catch (TableNotFoundException e) {
             e.printStackTrace();
+            throw new Error("Attempting to scan missing table: " + tablePrefix + "prospects", e);
         }
         bs.setRanges(Collections.singleton(Range.prefix(new Text("predicate" + "\u0000"))));
         final Iterator<Entry<Key,Value>> iter = bs.iterator();

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java
index 709392e..a37b14ad 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java
@@ -478,7 +478,9 @@ public class StarQuery {
             }
 
         }
-
+        if (vars == null) {
+            throw new NullPointerException("vars is null so the list of statement pattern nodes must be empty: nodes.size()= " + nodes.size());
+        }
         if (vars.size() == 1) {
             return vars.iterator().next();
         } else if (vars.size() > 1) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/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 6a78680..48434ca 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
@@ -653,6 +653,9 @@ public class AccumuloTemporalIndexer extends AbstractAccumuloIndexer implements
                 ranges.add(range);
                 lastKeyParts = thisKeyParts;
             }
+            if (lastKeyParts == null || scanner == null) {
+                throw new NullPointerException("lastkeyParts or scanner is null, impossible! keyParts.size()= " + keyParts.size() + " scanner= " + scanner);
+            }
             //System.out.println("Scanning columns, cf:" + lastKeyParts.cf + "CQ:" + lastKeyParts.cq);
             scanner.fetchColumn(new Text(lastKeyParts.cf), new Text(lastKeyParts.cq));
             if (scanner instanceof BatchScanner) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java
index a09b726..6de8e3b 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java
@@ -26,13 +26,18 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.MultiTableBatchWriter;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.log4j.Logger;
+import org.apache.rya.accumulo.experimental.AbstractAccumuloIndexer;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.log.LogUtils;
+import org.apache.rya.api.persist.RyaDAO;
+import org.apache.rya.indexing.external.accumulo.AccumuloPcjStorageSupplier;
+import org.apache.rya.indexing.external.fluo.PcjUpdaterSupplierFactory;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
@@ -43,13 +48,8 @@ import org.openrdf.model.URI;
 import com.google.common.base.Optional;
 import com.google.common.base.Supplier;
 
-import org.apache.rya.accumulo.experimental.AbstractAccumuloIndexer;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.domain.RyaStatement;
-import org.apache.rya.api.domain.RyaURI;
-import org.apache.rya.api.persist.RyaDAO;
-import org.apache.rya.indexing.external.accumulo.AccumuloPcjStorageSupplier;
-import org.apache.rya.indexing.external.fluo.PcjUpdaterSupplierFactory;
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
 
 /**
  * Updates the state of the Precomputed Join indices that are used by Rya.
@@ -219,7 +219,7 @@ public class PrecomputedJoinIndexer extends AbstractAccumuloIndexer {
                     pcjStorage.purge(pcjId);
                 } catch (final PCJStorageException e) {
                     log.error(
-                            "Could not purge the PCJ index with id: " + pcjId,
+                                    "Could not purge the PCJ index with id: " + LogUtils.clean(pcjId),
                             e);
                 }
             }
@@ -237,18 +237,18 @@ public class PrecomputedJoinIndexer extends AbstractAccumuloIndexer {
     @Override
     public void dropAndDestroy() {
         try {
-            for (final String pcjId : pcjStorage.listPcjs()) {
+            for (String pcjId : pcjStorage.listPcjs()) {// FIXME final
                 try {
                     pcjStorage.dropPcj(pcjId);
                 } catch (final PCJStorageException e) {
                     log.error("Could not delete the PCJ index with id: "
-                            + pcjId, e);
+                                    + LogUtils.clean(pcjId), e);
                 }
             }
         } catch (final PCJStorageException e) {
             log.error(
-                    "Could not delete the PCJ indicies because they could not be listed.",
-                    e);
+                            "Could not delete the PCJ indicies because they could not be listed.",
+                            e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java
index d69d8d9..9d97b32 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java
@@ -44,7 +44,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.rya.indexing.pcj.matching.PCJOptimizerUtilities;
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
 import org.openrdf.query.algebra.Filter;
@@ -106,7 +105,7 @@ public class JoinSegment<T extends ExternalSet> extends AbstractQuerySegment<T>
      */
     @Override
     public boolean replaceWithExternalSet(QuerySegment<T> nodeToReplace, T set) {
-        Preconditions.checkNotNull(nodeToReplace != null);
+        Preconditions.checkNotNull(nodeToReplace); 
         Preconditions.checkNotNull(set);
         if (!containsQuerySegment(nodeToReplace)) {
             return false;

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java
index 2bae1cf..f1d56b8 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java
@@ -38,6 +38,15 @@ import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
+import org.apache.rya.accumulo.pcj.iterators.BindingSetHashJoinIterator;
+import org.apache.rya.accumulo.pcj.iterators.BindingSetHashJoinIterator.HashJoinType;
+import org.apache.rya.accumulo.pcj.iterators.IteratorCombiner;
+import org.apache.rya.accumulo.pcj.iterators.PCJKeyToCrossProductBindingSetIterator;
+import org.apache.rya.accumulo.pcj.iterators.PCJKeyToJoinBindingSetIterator;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.utils.IteratorWrapper;
+import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.apache.rya.indexing.pcj.matching.PCJOptimizerUtilities;
 import org.apache.rya.indexing.pcj.storage.PcjException;
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
@@ -45,6 +54,7 @@ import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjSerializer;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
 import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.rdftriplestore.evaluation.ExternalBatchingIterator;
 import org.openrdf.model.Value;
 import org.openrdf.query.Binding;
 import org.openrdf.query.BindingSet;
@@ -68,16 +78,6 @@ import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 
 import info.aduna.iteration.CloseableIteration;
-import org.apache.rya.accumulo.pcj.iterators.BindingSetHashJoinIterator;
-import org.apache.rya.accumulo.pcj.iterators.BindingSetHashJoinIterator.HashJoinType;
-import org.apache.rya.accumulo.pcj.iterators.IteratorCombiner;
-import org.apache.rya.accumulo.pcj.iterators.PCJKeyToCrossProductBindingSetIterator;
-import org.apache.rya.accumulo.pcj.iterators.PCJKeyToJoinBindingSetIterator;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.utils.IteratorWrapper;
-import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.apache.rya.indexing.pcj.matching.PCJOptimizerUtilities;
-import org.apache.rya.rdftriplestore.evaluation.ExternalBatchingIterator;
 
 /**
  * During query planning, this node is inserted into the parsed query to
@@ -175,31 +175,26 @@ public class AccumuloIndexSet extends ExternalTupleSet implements
 	}
 
 	/**
-	 *
-	 * @param accCon
-	 *            - connection to a valid Accumulo instance
-	 * @param tablename
-	 *            - name of an existing PCJ table
-	 * @throws MalformedQueryException
-	 * @throws SailException
-	 * @throws QueryEvaluationException
-	 * @throws TableNotFoundException
-	 * @throws AccumuloSecurityException
-	 * @throws AccumuloException
-	 */
+     *
+     * @param accCon
+     *            - connection to a valid Accumulo instance
+     * @param tablename
+     *            - name of an existing PCJ table
+     * @throws MalformedQueryException
+     * @throws SailException
+     * @throws QueryEvaluationException
+     * @throws TableNotFoundException
+     * @throws AccumuloSecurityException
+     * @throws AccumuloException
+     * @throws PCJStorageException
+     */
 	public AccumuloIndexSet(final Configuration conf, final String tablename)
 			throws MalformedQueryException, SailException,
-			QueryEvaluationException, TableNotFoundException, AccumuloException, AccumuloSecurityException {
+                    QueryEvaluationException, TableNotFoundException, AccumuloException, AccumuloSecurityException, PCJStorageException {
+        this.tablename = tablename;
 		this.accCon = ConfigUtils.getConnector(conf);
 		this.auths = getAuthorizations(conf);
-		PcjMetadata meta = null;
-		try {
-			meta = pcj.getPcjMetadata(accCon, tablename);
-		} catch (final PcjException e) {
-			e.printStackTrace();
-		}
-
-		this.tablename = tablename;
+        PcjMetadata meta = pcj.getPcjMetadata(accCon, tablename);
 		final SPARQLParser sp = new SPARQLParser();
 		final ParsedTupleQuery pq = (ParsedTupleQuery) sp.parseQuery(meta.getSparql(), null);
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/7b571d43/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java
index 4c6d976..59ee546 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java
@@ -24,14 +24,19 @@ import static org.junit.Assert.assertTrue;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.api.client.CreatePCJ;
 import org.apache.rya.api.client.DeletePCJ;
 import org.apache.rya.api.client.InstanceDoesNotExistException;
 import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.pcj.fluo.api.ListQueryIds;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
 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;
@@ -122,4 +127,66 @@ public class AccumuloDeletePCJIT extends FluoITBase {
         final DeletePCJ deletePCJ = new AccumuloDeletePCJ(createConnectionDetails(), accumuloConn);
         deletePCJ.deletePCJ(getRyaInstanceName(), "randomID");
     }
+
+    @Test
+    public void dropAndDestroyPCJ() throws InstanceDoesNotExistException, RyaClientException, PCJStorageException,
+                    RepositoryException, AccumuloException, AccumuloSecurityException, RyaDAOException {
+        // Initialize the commands that will be used by this test.
+        final CreatePCJ createPCJ = new AccumuloCreatePCJ(createConnectionDetails(), accumuloConn);
+    
+        // Create a PCJ.
+        final String sparql1 =
+                "SELECT ?x " +
+                  "WHERE { " +
+                  "?x <http://worksAt> <http://TacoJoint>." +
+                "}";
+        final String pcjId1 = createPCJ.createPCJ(getRyaInstanceName(), sparql1);
+        // Create a PCJ.
+        final String sparql2 =
+                "SELECT ?x " +
+                  "WHERE { " +
+                  "?x <http://talksTo> <http://Eve>. " +
+                "}";
+        final String pcjId2 = createPCJ.createPCJ(getRyaInstanceName(), sparql2);
+    
+        // Verify a Query ID was added for the query within the Fluo app.
+        List<String> fluoQueryIds = new ListQueryIds().listQueryIds(fluoClient);
+        assertEquals(2, fluoQueryIds.size());
+    
+        // Insert some statements into Rya.
+        final ValueFactory vf = ryaRepo.getValueFactory();
+        ryaConn.add(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
+        ryaConn.add(vf.createURI("http://Bob"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
+        ryaConn.add(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
+    
+        ryaConn.add(vf.createURI("http://Eve"), vf.createURI("http://helps"), vf.createURI("http://Kevin"));
+    
+        ryaConn.add(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
+        ryaConn.add(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
+        ryaConn.add(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
+        ryaConn.add(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
+    
+        // Verify the correct results were exported.
+        fluo.waitForObservers();
+    
+    
+        try(final PrecomputedJoinStorage pcjStorage = new AccumuloPcjStorage(accumuloConn, getRyaInstanceName())) {
+            assertEquals("the PCJ's metadata was added the storage.", 2, pcjStorage.listPcjs().size());
+
+            // Delete all PCJ's.
+            AccumuloRyaDAO dao = RyaSailFactory.getAccumuloDAOWithUpdatedConfig(conf);
+            dao.dropAndDestroy();
+    
+            // Ensure the PCJ's metadata has been removed from the storage.
+            assertTrue("the PCJ's metadata has been removed from the storage.", pcjStorage.listPcjs().isEmpty());
+    
+            // Ensure the PCJ has been removed from the Fluo application.
+            fluo.waitForObservers();
+    
+            // Verify Query IDs were deleted for the query within the Fluo app.
+            // TODO this fails, shows expected 0, but was 2.
+            // fluoQueryIds = new ListQueryIds().listQueryIds(fluoClient);
+            // assertEquals("Verify Query IDs were deleted for the query within the Fluo app.", 0, fluoQueryIds.size());
+        }
+    }
 }
\ No newline at end of file