RYA-413 Fixed how MongoDBRyaDAO closed its internal mongoClient. Updated AbstractMongoDBRdfConfigurationBuilder config tags. Closes #263.
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/AbstractMongoDBRdfConfigurationBuilder.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/AbstractMongoDBRdfConfigurationBuilder.java
index 369f7a0..8afcb42 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/AbstractMongoDBRdfConfigurationBuilder.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/AbstractMongoDBRdfConfigurationBuilder.java
@@ -40,23 +40,23 @@
     private boolean useMock = false;
     private String host = "localhost";
     private String port = DEFAULT_MONGO_PORT;
-    protected static final String DEFAULT_MONGO_PORT = "27017";
+    public static final String DEFAULT_MONGO_PORT = "27017";
     private String mongoCollectionPrefix = "rya_";
     private String mongoDBName = "rya";
     private boolean usePipeline = false;
 
-    protected static final String MONGO_USER = "mongo.user";
-    protected static final String MONGO_PASSWORD = "mongo.password";
-    protected static final String MONGO_DB_NAME = "mongo.db.name";
-    protected static final String MONGO_COLLECTION_PREFIX = "mongo.collection.prefix";
-    protected static final String MONGO_HOST = "mongo.host";
-    protected static final String MONGO_PORT = "mongo.port";
-    protected static final String MONGO_AUTHS = "mongo.auths";
-    protected static final String MONGO_VISIBILITIES = "mongo.visibilities";
-    protected static final String MONGO_RYA_PREFIX = "mongo.rya.prefix";
-    protected static final String USE_INFERENCE = "use.inference";
-    protected static final String USE_DISPLAY_QUERY_PLAN = "use.display.plan";
-    protected static final String USE_MOCK_MONGO = "use.mock";
+    public static final String MONGO_USER = "mongo.user";
+    public static final String MONGO_PASSWORD = "mongo.password";
+    public static final String MONGO_DB_NAME = "mongo.db.name";
+    public static final String MONGO_COLLECTION_PREFIX = "mongo.collection.prefix";
+    public static final String MONGO_HOST = "mongo.host";
+    public static final String MONGO_PORT = "mongo.port";
+    public static final String MONGO_AUTHS = "mongo.auths";
+    public static final String MONGO_VISIBILITIES = "mongo.visibilities";
+    public static final String MONGO_RYA_PREFIX = "mongo.rya.prefix";
+    public static final String USE_INFERENCE = "use.inference";
+    public static final String USE_DISPLAY_QUERY_PLAN = "use.display.plan";
+    public static final String USE_MOCK_MONGO = "use.mock";
 
     /**
      * Sets Mongo user.
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 75e33d1..d01c2d7 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
@@ -152,9 +152,6 @@
                 log.error("Error closing indexer: " + indexer.getClass().getSimpleName(), e);
             }
         }
-        if (mongoClient != null) {
-            mongoClient.close();
-        }
 
         IOUtils.closeQuietly(queryEngine);
     }
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAO2IT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAO2IT.java
index f2d24ad..67002d7 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAO2IT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAO2IT.java
@@ -18,7 +18,10 @@
  */
 package org.apache.rya.mongodb;
 
+import static org.apache.rya.mongodb.dao.SimpleMongoDBStorageStrategy.DOCUMENT_VISIBILITY;
+import static org.apache.rya.mongodb.dao.SimpleMongoDBStorageStrategy.TIMESTAMP;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 
@@ -26,6 +29,7 @@
 import org.apache.rya.api.domain.RyaStatement.RyaStatementBuilder;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.persist.RyaDAOException;
+import org.apache.rya.mongodb.document.visibility.DocumentVisibility;
 import org.bson.Document;
 import org.junit.Test;
 
@@ -135,4 +139,65 @@
             dao.destroy();
         }
     }
+
+    @Test
+    public void testReconstructDao() throws RyaDAOException, IOException {
+        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+
+            final RyaStatementBuilder builder = new RyaStatementBuilder();
+            builder.setPredicate(new RyaURI("http://temp.com"));
+            builder.setSubject(new RyaURI("http://subject.com"));
+            builder.setObject(new RyaURI("http://object.com"));
+            builder.setColumnVisibility(new DocumentVisibility("B").flatten());
+
+            final MongoDatabase db = conf.getMongoClient().getDatabase(conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
+            final MongoCollection<Document> coll = db.getCollection(conf.getTriplesCollectionName());
+
+            dao.add(builder.build());
+
+            assertEquals(coll.count(), 1);
+
+            final Document dbo = coll.find().first();
+            assertTrue(dbo.containsKey(DOCUMENT_VISIBILITY));
+            assertTrue(dbo.containsKey(TIMESTAMP));
+        }  finally {
+            dao.destroy();
+        }
+
+        // Test reinitializing the same instance
+        try {
+            dao.init();
+        } finally {
+            dao.destroy();
+        }
+
+        // Reconstruct new DAO and try again
+        dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+
+            final RyaStatementBuilder builder = new RyaStatementBuilder();
+            builder.setPredicate(new RyaURI("http://temp.com"));
+            builder.setSubject(new RyaURI("http://subject.com"));
+            builder.setObject(new RyaURI("http://object.com"));
+            builder.setColumnVisibility(new DocumentVisibility("B").flatten());
+
+            final MongoDatabase db = conf.getMongoClient().getDatabase(conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
+            final MongoCollection<Document> coll = db.getCollection(conf.getTriplesCollectionName());
+
+            dao.add(builder.build());
+
+            assertEquals(coll.count(), 1);
+
+            final Document dbo = coll.find().first();
+            assertTrue(dbo.containsKey(DOCUMENT_VISIBILITY));
+            assertTrue(dbo.containsKey(TIMESTAMP));
+        }  finally {
+            dao.destroy();
+        }
+    }
 }
\ No newline at end of file
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAOIT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAOIT.java
index a05393c..c5ff223 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAOIT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAOIT.java
@@ -154,6 +154,67 @@
     }
 
     @Test
+    public void testReconstructDao() throws RyaDAOException, IOException {
+        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+
+            final RyaStatementBuilder builder = new RyaStatementBuilder();
+            builder.setPredicate(new RyaURI("http://temp.com"));
+            builder.setSubject(new RyaURI("http://subject.com"));
+            builder.setObject(new RyaURI("http://object.com"));
+            builder.setColumnVisibility(new DocumentVisibility("B").flatten());
+
+            final MongoDatabase db = conf.getMongoClient().getDatabase(conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
+            final MongoCollection<Document> coll = db.getCollection(conf.getTriplesCollectionName());
+
+            dao.add(builder.build());
+
+            assertEquals(coll.count(), 1);
+
+            final Document dbo = coll.find().first();
+            assertTrue(dbo.containsKey(DOCUMENT_VISIBILITY));
+            assertTrue(dbo.containsKey(TIMESTAMP));
+        }  finally {
+            dao.destroy();
+        }
+
+        // Test reinitializing the same instance
+        try {
+            dao.init();
+        } finally {
+            dao.destroy();
+        }
+
+        // Reconstruct new DAO and try again
+        dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+
+            final RyaStatementBuilder builder = new RyaStatementBuilder();
+            builder.setPredicate(new RyaURI("http://temp.com"));
+            builder.setSubject(new RyaURI("http://subject.com"));
+            builder.setObject(new RyaURI("http://object.com"));
+            builder.setColumnVisibility(new DocumentVisibility("B").flatten());
+
+            final MongoDatabase db = conf.getMongoClient().getDatabase(conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
+            final MongoCollection<Document> coll = db.getCollection(conf.getTriplesCollectionName());
+
+            dao.add(builder.build());
+
+            assertEquals(coll.count(), 1);
+
+            final Document dbo = coll.find().first();
+            assertTrue(dbo.containsKey(DOCUMENT_VISIBILITY));
+            assertTrue(dbo.containsKey(TIMESTAMP));
+        }  finally {
+            dao.destroy();
+        }
+    }
+
+    @Test
     public void testVisibility() throws RyaDAOException, MongoException, IOException {
         final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
diff --git a/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaMongoDbSailFactoryTest.java b/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaMongoDbSailFactoryTest.java
new file mode 100644
index 0000000..6cfd4ea
--- /dev/null
+++ b/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaMongoDbSailFactoryTest.java
@@ -0,0 +1,149 @@
+/*
+ * 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.sail.config;
+
+import static org.junit.Assert.assertFalse;
+
+import org.apache.rya.mongodb.MongoITBase;
+import org.junit.Assert;
+import org.junit.Test;
+import org.openrdf.model.Statement;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.repository.sail.SailRepositoryConnection;
+import org.openrdf.sail.Sail;
+
+/**
+ * Tests {@link RyaSailFactory} with a MongoDB backend.
+ */
+public class RyaMongoDbSailFactoryTest extends MongoITBase {
+    @Test
+    public void testCreateMongoDbSail() throws Exception {
+        Sail sail = null;
+        SailRepository repo = null;
+        SailRepositoryConnection conn = null;
+        try {
+            sail = RyaSailFactory.getInstance(conf);
+            repo = new SailRepository(sail);
+            conn = repo.getConnection();
+        } finally {
+            if (conn != null) {
+                conn.close();
+            }
+            if (repo != null) {
+                repo.shutDown();
+            }
+            if (sail != null) {
+                sail.shutDown();
+            }
+        }
+    }
+
+    @Test
+    public void testAddStatement() throws Exception {
+        Sail sail = null;
+        SailRepository repo = null;
+        SailRepositoryConnection conn = null;
+        try {
+            sail = RyaSailFactory.getInstance(conf);
+            repo = new SailRepository(sail);
+            conn = repo.getConnection();
+
+            final ValueFactory vf = conn.getValueFactory();
+            final Statement s = vf.createStatement(vf.createURI("u:a"), vf.createURI("u:b"), vf.createURI("u:c"));
+
+            assertFalse(conn.hasStatement(s, false));
+
+            conn.add(s);
+
+            Assert.assertTrue(conn.hasStatement(s, false));
+        } finally {
+            if (conn != null) {
+                conn.close();
+            }
+            if (repo != null) {
+                repo.shutDown();
+            }
+            if (sail != null) {
+                sail.shutDown();
+            }
+        }
+    }
+
+    @Test
+    public void testReuseSail() throws Exception {
+        Sail sail = null;
+        SailRepository repo = null;
+        SailRepositoryConnection conn = null;
+        try {
+            sail = RyaSailFactory.getInstance(conf);
+            repo = new SailRepository(sail);
+            conn = repo.getConnection();
+
+            final ValueFactory vf = conn.getValueFactory();
+            final Statement s = vf.createStatement(vf.createURI("u:a"), vf.createURI("u:b"), vf.createURI("u:c"));
+
+            assertFalse(conn.hasStatement(s, false));
+
+            conn.add(s);
+
+            Assert.assertTrue(conn.hasStatement(s, false));
+
+            conn.remove(s);
+
+            Assert.assertFalse(conn.hasStatement(s, false));
+        } finally {
+            if (conn != null) {
+                conn.close();
+            }
+            if (repo != null) {
+                repo.shutDown();
+            }
+            if (sail != null) {
+                sail.shutDown();
+            }
+        }
+
+        // Reuse Sail after shutdown
+        try {
+            sail = RyaSailFactory.getInstance(conf);
+            repo = new SailRepository(sail);
+            conn = repo.getConnection();
+
+            final ValueFactory vf = conn.getValueFactory();
+            final Statement s = vf.createStatement(vf.createURI("u:a"), vf.createURI("u:b"), vf.createURI("u:c"));
+
+            assertFalse(conn.hasStatement(s, false));
+
+            conn.add(s);
+
+            Assert.assertTrue(conn.hasStatement(s, false));
+        } finally {
+            if (conn != null) {
+                conn.close();
+            }
+            if (repo != null) {
+                repo.shutDown();
+            }
+            if (sail != null) {
+                sail.shutDown();
+            }
+        }
+    }
+}
\ No newline at end of file