You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2016/01/19 18:47:08 UTC

svn commit: r1725576 - in /sling/trunk/contrib/nosql: couchbase-resourceprovider/ couchbase-resourceprovider/src/main/java/org/apache/sling/nosql/couchbase/resourceprovider/impl/ generic/ generic/src/main/java/org/apache/sling/nosql/generic/adapter/ ge...

Author: sseifert
Date: Tue Jan 19 17:47:07 2016
New Revision: 1725576

URL: http://svn.apache.org/viewvc?rev=1725576&view=rev
Log:
SLING-5437 add connection check for couchbase resource provider
define separate NoSqlAdapter methods for creating index definitions, to ensure they are only executed after connection test succeeds
set versions to 1.1.0

Modified:
    sling/trunk/contrib/nosql/couchbase-resourceprovider/pom.xml
    sling/trunk/contrib/nosql/couchbase-resourceprovider/src/main/java/org/apache/sling/nosql/couchbase/resourceprovider/impl/CouchbaseNoSqlAdapter.java
    sling/trunk/contrib/nosql/generic/pom.xml
    sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/AbstractNoSqlAdapter.java
    sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/MetricsNoSqlAdapterWrapper.java
    sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
    sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
    sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/ValueMapConvertingNoSqlAdapter.java
    sling/trunk/contrib/nosql/generic/src/test/java/org/apache/sling/nosql/generic/simple/provider/SimpleNoSqlAdapter.java
    sling/trunk/contrib/nosql/mongodb-resourceprovider/pom.xml
    sling/trunk/contrib/nosql/mongodb-resourceprovider/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java
    sling/trunk/contrib/nosql/mongodb-resourceprovider/src/test/java/org/apache/sling/nosql/mongodb/resourceprovider/integration/IndexCreationIT.java

Modified: sling/trunk/contrib/nosql/couchbase-resourceprovider/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/couchbase-resourceprovider/pom.xml?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/couchbase-resourceprovider/pom.xml (original)
+++ sling/trunk/contrib/nosql/couchbase-resourceprovider/pom.xml Tue Jan 19 17:47:07 2016
@@ -28,7 +28,7 @@
     </parent>
 
     <artifactId>org.apache.sling.nosql.couchbase-resourceprovider</artifactId>
-    <version>1.0.1-SNAPSHOT</version>
+    <version>1.1.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
   
     <name>Apache Sling NoSQL Couchbase Resource Provider</name>
@@ -56,7 +56,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.nosql.generic</artifactId>
-            <version>1.0.0</version>
+            <version>1.1.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
     

Modified: sling/trunk/contrib/nosql/couchbase-resourceprovider/src/main/java/org/apache/sling/nosql/couchbase/resourceprovider/impl/CouchbaseNoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/couchbase-resourceprovider/src/main/java/org/apache/sling/nosql/couchbase/resourceprovider/impl/CouchbaseNoSqlAdapter.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/couchbase-resourceprovider/src/main/java/org/apache/sling/nosql/couchbase/resourceprovider/impl/CouchbaseNoSqlAdapter.java (original)
+++ sling/trunk/contrib/nosql/couchbase-resourceprovider/src/main/java/org/apache/sling/nosql/couchbase/resourceprovider/impl/CouchbaseNoSqlAdapter.java Tue Jan 19 17:47:07 2016
@@ -26,12 +26,15 @@ import java.util.Iterator;
 import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.nosql.couchbase.client.CouchbaseClient;
 import org.apache.sling.nosql.couchbase.client.CouchbaseKey;
 import org.apache.sling.nosql.generic.adapter.AbstractNoSqlAdapter;
 import org.apache.sling.nosql.generic.adapter.MultiValueMode;
 import org.apache.sling.nosql.generic.adapter.NoSqlData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.couchbase.client.java.Bucket;
 import com.couchbase.client.java.document.JsonDocument;
@@ -57,14 +60,11 @@ public final class CouchbaseNoSqlAdapter
     
     private static final N1qlParams N1QL_PARAMS = N1qlParams.build().consistency(ScanConsistency.REQUEST_PLUS);
 
+    private static final Logger log = LoggerFactory.getLogger(CouchbaseNoSqlAdapter.class);
+
     public CouchbaseNoSqlAdapter(CouchbaseClient couchbaseClient, String cacheKeyPrefix) {
         this.couchbaseClient = couchbaseClient;
         this.cacheKeyPrefix = cacheKeyPrefix;
-        
-        // make sure primary index and index on parentPath is present - ignore error if it is already present
-        Bucket bucket = couchbaseClient.getBucket();
-        bucket.query(N1qlQuery.simple("CREATE PRIMARY INDEX ON `" + couchbaseClient.getBucketName() + "`"));
-        bucket.query(N1qlQuery.simple("CREATE INDEX " + PN_PARENT_PATH + " ON `" + couchbaseClient.getBucketName() + "`(" + PN_PARENT_PATH + ")"));
     }
 
     @Override
@@ -183,4 +183,30 @@ public final class CouchbaseNoSqlAdapter
         }
     }
 
+    @Override
+    public void checkConnection() throws LoginException {
+        // try to access root element to check connection
+        try {
+            Bucket bucket = couchbaseClient.getBucket();
+            String cacheKey = CouchbaseKey.build("/", cacheKeyPrefix);
+            bucket.exists(cacheKey);
+        }
+        catch (Throwable ex) {
+            throw new LoginException(ex);
+        }
+    }
+
+    @Override
+    public void createIndexDefinitions() {
+        // make sure primary index and index on parentPath is present - ignore error if it is already present
+        try {
+            Bucket bucket = couchbaseClient.getBucket();
+            bucket.query(N1qlQuery.simple("CREATE PRIMARY INDEX ON `" + couchbaseClient.getBucketName() + "`"));
+            bucket.query(N1qlQuery.simple("CREATE INDEX " + PN_PARENT_PATH + " ON `" + couchbaseClient.getBucketName() + "`(" + PN_PARENT_PATH + ")"));
+        }
+        catch (Throwable ex) {
+            log.debug("Unable to create/validate couchbase index definitions: " + ex.getMessage(), ex);
+        }
+    }
+
 }

Modified: sling/trunk/contrib/nosql/generic/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/generic/pom.xml?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/generic/pom.xml (original)
+++ sling/trunk/contrib/nosql/generic/pom.xml Tue Jan 19 17:47:07 2016
@@ -28,7 +28,7 @@
     </parent>
 
     <artifactId>org.apache.sling.nosql.generic</artifactId>
-    <version>1.0.1-SNAPSHOT</version>
+    <version>1.1.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Apache Sling NoSQL Generic Resource Provider</name>

Modified: sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/AbstractNoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/AbstractNoSqlAdapter.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/AbstractNoSqlAdapter.java (original)
+++ sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/AbstractNoSqlAdapter.java Tue Jan 19 17:47:07 2016
@@ -20,8 +20,6 @@ package org.apache.sling.nosql.generic.a
 
 import java.util.Iterator;
 
-import org.apache.sling.api.resource.LoginException;
-
 import aQute.bnd.annotation.ConsumerType;
 
 /**
@@ -42,9 +40,4 @@ public abstract class AbstractNoSqlAdapt
         return null;
     }
     
-    @Override
-    public void checkConnection() throws LoginException {
-        // not supported unless it is overwritten explicitly
-    }
-
 }

Modified: sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/MetricsNoSqlAdapterWrapper.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/MetricsNoSqlAdapterWrapper.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/MetricsNoSqlAdapterWrapper.java (original)
+++ sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/MetricsNoSqlAdapterWrapper.java Tue Jan 19 17:47:07 2016
@@ -95,6 +95,11 @@ public final class MetricsNoSqlAdapterWr
         delegate.checkConnection();
     }
 
+    @Override
+    public void createIndexDefinitions() {
+        delegate.createIndexDefinitions();
+    }    
+
     private class Metrics {
         
         private long startTime;
@@ -113,5 +118,5 @@ public final class MetricsNoSqlAdapterWr
         }
         
     }
-    
+
 }

Modified: sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java (original)
+++ sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java Tue Jan 19 17:47:07 2016
@@ -78,9 +78,16 @@ public interface NoSqlAdapter {
 
     /**
      * Checks whether the connection to the NoSQL database is possible
-     *
      * @throws LoginException in case of any errors
      */
     void checkConnection() throws LoginException;
 
+    /**
+     * Creates index definitions for accessing the NoSQL database.
+     * This is called every time an adapter instances is created. If the indexes are
+     * already present it should do nothing.
+     * It is only called when the {@link #checkConnection()} call succeeds.
+     */
+    void createIndexDefinitions();
+
 }

Modified: sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java (original)
+++ sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java Tue Jan 19 17:47:07 2016
@@ -39,6 +39,7 @@ public abstract class AbstractNoSqlResou
     public final ResourceProvider getResourceProvider(Map<String, Object> authenticationInfo) throws LoginException {
         NoSqlAdapter adapter = getNoSqlAdapter();
         adapter.checkConnection();
+        adapter.createIndexDefinitions();
         return new NoSqlResourceProvider(adapter, getEventAdmin());
     }
 

Modified: sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/ValueMapConvertingNoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/ValueMapConvertingNoSqlAdapter.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/ValueMapConvertingNoSqlAdapter.java (original)
+++ sling/trunk/contrib/nosql/generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/ValueMapConvertingNoSqlAdapter.java Tue Jan 19 17:47:07 2016
@@ -169,6 +169,11 @@ class ValueMapConvertingNoSqlAdapter imp
         delegate.checkConnection();
     }
 
+    @Override
+    public void createIndexDefinitions() {
+        delegate.createIndexDefinitions();
+    }
+
     private static DateFormat getISO8601Format() {
         return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
     }

Modified: sling/trunk/contrib/nosql/generic/src/test/java/org/apache/sling/nosql/generic/simple/provider/SimpleNoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/generic/src/test/java/org/apache/sling/nosql/generic/simple/provider/SimpleNoSqlAdapter.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/generic/src/test/java/org/apache/sling/nosql/generic/simple/provider/SimpleNoSqlAdapter.java (original)
+++ sling/trunk/contrib/nosql/generic/src/test/java/org/apache/sling/nosql/generic/simple/provider/SimpleNoSqlAdapter.java Tue Jan 19 17:47:07 2016
@@ -117,7 +117,12 @@ public class SimpleNoSqlAdapter implemen
 
     @Override
     public void checkConnection() throws LoginException {
+        // nothing to do
+    }
 
+    @Override
+    public void createIndexDefinitions() {
+        // nothing to do
     }
 
 }

Modified: sling/trunk/contrib/nosql/mongodb-resourceprovider/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/mongodb-resourceprovider/pom.xml?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/mongodb-resourceprovider/pom.xml (original)
+++ sling/trunk/contrib/nosql/mongodb-resourceprovider/pom.xml Tue Jan 19 17:47:07 2016
@@ -28,7 +28,7 @@
     </parent>
 
     <artifactId>org.apache.sling.nosql.mongodb-resourceprovider</artifactId>
-    <version>1.0.1-SNAPSHOT</version>
+    <version>1.1.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
   
     <name>Apache Sling NoSQL MongoDB Resource Provider</name>
@@ -49,7 +49,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.nosql.generic</artifactId>
-            <version>1.0.1-SNAPSHOT</version>
+            <version>1.1.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
     

Modified: sling/trunk/contrib/nosql/mongodb-resourceprovider/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/mongodb-resourceprovider/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/mongodb-resourceprovider/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java (original)
+++ sling/trunk/contrib/nosql/mongodb-resourceprovider/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java Tue Jan 19 17:47:07 2016
@@ -66,32 +66,6 @@ public final class MongoDBNoSqlAdapter e
     public MongoDBNoSqlAdapter(MongoClient mongoClient, String database, String collection) {
         MongoDatabase db = mongoClient.getDatabase(database);
         this.collection = db.getCollection(collection);
-        
-        // create index on parent path field (if it does not exist yet)
-        try {
-            Document parenPathtIndex = new Document(PN_PARENT_PATH, 1);
-            this.collection.createIndex(parenPathtIndex);
-        }
-        catch (DuplicateKeyException ex) {
-            // index already exists, ignore
-        }
-        catch (Throwable ex) {
-            log.error("Unable to create index on " + PN_PARENT_PATH + ": " + ex.getMessage(), ex);
-        }
-        
-        // create unique index on path field (if it does not exist yet)
-        try {
-            Document pathIndex = new Document(PN_PATH, 1);
-            IndexOptions idxOptions = new IndexOptions();
-            idxOptions.unique(true);
-            this.collection.createIndex(pathIndex, idxOptions);
-        }
-        catch (DuplicateKeyException ex) {
-            // index already exists, ignore
-        }
-        catch (Throwable ex) {
-            log.error("Unable to create unique index on " + PN_PATH + ": " + ex.getMessage(), ex);
-        }
     }
 
     @Override
@@ -156,4 +130,34 @@ public final class MongoDBNoSqlAdapter e
             throw new LoginException(e);
         }
     }
+
+    @Override
+    public void createIndexDefinitions() {
+        // create index on parent path field (if it does not exist yet)
+        try {
+            Document parenPathtIndex = new Document(PN_PARENT_PATH, 1);
+            this.collection.createIndex(parenPathtIndex);
+        }
+        catch (DuplicateKeyException ex) {
+            // index already exists, ignore
+        }
+        catch (Throwable ex) {
+            log.error("Unable to create index on " + PN_PARENT_PATH + ": " + ex.getMessage(), ex);
+        }
+        
+        // create unique index on path field (if it does not exist yet)
+        try {
+            Document pathIndex = new Document(PN_PATH, 1);
+            IndexOptions idxOptions = new IndexOptions();
+            idxOptions.unique(true);
+            this.collection.createIndex(pathIndex, idxOptions);
+        }
+        catch (DuplicateKeyException ex) {
+            // index already exists, ignore
+        }
+        catch (Throwable ex) {
+            log.error("Unable to create unique index on " + PN_PATH + ": " + ex.getMessage(), ex);
+        }
+    }
+
 }

Modified: sling/trunk/contrib/nosql/mongodb-resourceprovider/src/test/java/org/apache/sling/nosql/mongodb/resourceprovider/integration/IndexCreationIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/nosql/mongodb-resourceprovider/src/test/java/org/apache/sling/nosql/mongodb/resourceprovider/integration/IndexCreationIT.java?rev=1725576&r1=1725575&r2=1725576&view=diff
==============================================================================
--- sling/trunk/contrib/nosql/mongodb-resourceprovider/src/test/java/org/apache/sling/nosql/mongodb/resourceprovider/integration/IndexCreationIT.java (original)
+++ sling/trunk/contrib/nosql/mongodb-resourceprovider/src/test/java/org/apache/sling/nosql/mongodb/resourceprovider/integration/IndexCreationIT.java Tue Jan 19 17:47:07 2016
@@ -21,7 +21,8 @@ package org.apache.sling.nosql.mongodb.r
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.sling.nosql.mongodb.resourceprovider.impl.MongoDBNoSqlAdapter;
 import org.bson.Document;
@@ -29,6 +30,7 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableList;
 import com.mongodb.MongoClient;
 
 /**
@@ -43,12 +45,14 @@ public class IndexCreationIT {
 	private String collection;
 		
 	@Before
-	public void setUp() {
+	public void setUp() throws Exception {
 	    String connectionString = System.getProperty("connectionString", "localhost:27017");
         database =  System.getProperty("database", "sling") + "_indextest";
         collection = System.getProperty("collection", "resources");
 		mongoClient = new MongoClient(connectionString);
 		underTest = new MongoDBNoSqlAdapter(mongoClient, database, collection);
+		underTest.checkConnection();
+		underTest.createIndexDefinitions();
 	}
 
 	@After
@@ -61,17 +65,14 @@ public class IndexCreationIT {
 	public void testIndexesPresent() {
 		assertNotNull(underTest);
 		
-		//expecting 2 indexes (_id, parentPath)
-		int expected = 2;
-		int actual = 0;
+		final List<String> expectedIndexNames= ImmutableList.<String>of("_id_", "parentPath_1");
 		
-		final String[] expectedIndexesNames=  {"_id_", "parentPath_1"};
-		
-		for (Document d : mongoClient.getDatabase(database).getCollection(collection).listIndexes()){
-			assert Arrays.asList(expectedIndexesNames).contains( d.get("name") );
-			actual++;
+		List<String> actualIndexNames = new ArrayList<String>();
+		for (Document d : mongoClient.getDatabase(database).getCollection(collection).listIndexes()) {
+		    actualIndexNames.add(d.get("name").toString());
 		}
-		assertEquals(expected, actual);
+		
+		assertEquals(expectedIndexNames, actualIndexNames);
 	}
 
 }