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 2015/05/15 18:40:22 UTC

svn commit: r1679602 - in /sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic: ./ src/main/java/org/apache/sling/nosql/generic/adapter/ src/main/java/org/apache/sling/nosql/generic/impl/ src/main/java/org/apache/sling/nosql/generic/resource/ src/...

Author: sseifert
Date: Fri May 15 16:40:21 2015
New Revision: 1679602

URL: http://svn.apache.org/r1679602
Log:
new approach

Added:
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java   (with props)
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml   (with props)
Removed:
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/impl/
Modified:
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml

Modified: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml?rev=1679602&r1=1679601&r2=1679602&view=diff
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml (original)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml Fri May 15 16:40:21 2015
@@ -55,32 +55,55 @@
     
     <dependencies>
         <dependency>
-    	    <groupId>org.apache.sling</groupId>
-    	    <artifactId>org.apache.sling.api</artifactId>
-    	    <version>2.7.0</version>
-    	    <scope>provided</scope>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.api</artifactId>
+            <version>2.9.0</version>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.osgi</artifactId>
-            <version>2.1.0</version>
+            <version>2.2.2</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
-        	<groupId>org.apache.felix</groupId>
-        	<artifactId>org.apache.felix.scr.annotations</artifactId>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.testing.sling-mock</artifactId>
+            <version>1.2.0</version>
         </dependency>
+
         <dependency>
-        	<groupId>org.slf4j</groupId>
-        	<artifactId>slf4j-api</artifactId>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
-        	<groupId>javax.servlet</groupId>
-        	<artifactId>servlet-api</artifactId>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>1.10.19</version>
+            <scope>test</scope>
         </dependency>
+
     </dependencies>
+
 </project>

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java Fri May 15 16:40:21 2015
@@ -0,0 +1,64 @@
+/*
+ * 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.sling.nosql.generic.adapter;
+
+import java.util.Iterator;
+
+/**
+ * Adapter for NoSQL databases to be hooked into the Generic NoSQL resource provider.
+ */
+public interface NoSqlAdapter {
+
+    /**
+     * Get data for a single resource from NoSQL database.
+     * @param path Path
+     * @return Data or null if non exists
+     */
+    NoSqlData get(String path);
+
+    /**
+     * Get data for all children of a resource from NoSQL database.
+     * @param parentPath Parent path
+     * @return List if child data or empty iterator
+     */
+    Iterator<NoSqlData> getChildren(String parentPath);
+    
+    /**
+     * Store data with the given path in NoSQL database.
+     * @param data Data with path
+     * @return true if a new entry was created, false if an existing was overridden.
+     */
+    boolean store(NoSqlData data);
+    
+    /**
+     * Remove data including all path-related children from NoSQL database.
+     * @param path Path to remove
+     * @return true if anything was removed
+     */
+    boolean deleteRecursive(String path);
+
+    /**
+     * Query for data.
+     * @param query Query
+     * @param language Query language
+     * @return Query result or null if query not supported
+     */
+    Iterator<NoSqlData> query(String query, String language);
+        
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java Fri May 15 16:40:21 2015
@@ -0,0 +1,41 @@
+/*
+ * 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.sling.nosql.generic.adapter;
+
+import java.util.Map;
+
+public final class NoSqlData {
+
+    private final String path;
+    private final Map<String,Object> properties;
+    
+    public NoSqlData(String path, Map<String, Object> properties) {
+        this.path = path;
+        this.properties = properties;
+    }
+
+    public String getPath() {
+        return path;
+    }
+    
+    public Map<String, Object> getProperties() {
+        return properties;
+    }
+    
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java Fri May 15 16:40:21 2015
@@ -0,0 +1,44 @@
+/*
+ * 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.sling.nosql.generic.resource;
+
+import java.util.Map;
+
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceProviderFactory;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.resource.impl.NoSqlResourceProvider;
+import org.osgi.service.event.EventAdmin;
+
+public abstract class AbstractNoSqlResourceProviderFactory implements ResourceProviderFactory {
+
+    public final ResourceProvider getResourceProvider(Map<String, Object> authenticationInfo) throws LoginException {
+        return new NoSqlResourceProvider(getNoSqlAdapter(), getEventAdmin());
+    }
+
+    public final ResourceProvider getAdministrativeResourceProvider(Map<String, Object> authenticationInfo) throws LoginException {
+        return getResourceProvider(authenticationInfo);
+    }
+    
+    protected abstract NoSqlAdapter getNoSqlAdapter();
+
+    protected abstract EventAdmin getEventAdmin();
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java Fri May 15 16:40:21 2015
@@ -0,0 +1,147 @@
+/*
+ * 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.sling.nosql.generic.resource.impl;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.apache.sling.api.SlingConstants;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+class NoSqlModifyingResourceProvider {
+
+    private final NoSqlAdapter adapter;
+    private final EventAdmin eventAdmin;
+    private final Map<String, NoSqlData> changedResources;
+    private final Set<String> deletedResources;
+    
+    public NoSqlModifyingResourceProvider(NoSqlAdapter adapter, EventAdmin eventAdmin,
+            Map<String, NoSqlData> changedResources, Set<String> deletedResources) {
+        this.adapter = adapter;
+        this.eventAdmin = eventAdmin;
+        this.changedResources = changedResources;
+        this.deletedResources = deletedResources;
+    }
+
+    public Resource create(ResourceResolver resolver, String path, Map<String, Object> properties)
+            throws PersistenceException {
+
+        // check if already exists
+        boolean deleted = this.deletedResources.remove(path);
+        boolean exists = changedResources.containsKey(path) || this.adapter.get(path) != null;
+        if (!deleted && exists) {
+            throw new PersistenceException("Resource already exists at " + path, null, path, null);
+        }
+        
+        // create new resource in changeset
+        NoSqlData data = new NoSqlData(path, properties);
+        changedResources.put(path, data);
+        return new NoSqlResource(data, resolver);
+    }
+    
+    public void delete(ResourceResolver resolver, String path) throws PersistenceException {
+        Pattern pathsToDeletePattern = PathUtil.getSameOrDescendantPathPattern(path);
+
+        // remove all existing path and probably descendant paths from list of deleted paths
+        Iterator<String> deletedResourcesIterator = deletedResources.iterator();
+        while (deletedResourcesIterator.hasNext()) {
+            String deletedPath = deletedResourcesIterator.next();
+            if (pathsToDeletePattern.matcher(deletedPath).matches()) {
+                deletedResourcesIterator.remove();
+            }
+        }
+        
+        // remove all changed descendant items from changeset
+        Iterator<Map.Entry<String, NoSqlData>> changeResourcesIterator = changedResources.entrySet().iterator();
+        while (changeResourcesIterator.hasNext()) {
+            Map.Entry<String, NoSqlData> entry = changeResourcesIterator.next();
+            if (pathsToDeletePattern.matcher(entry.getKey()).matches()) {
+                changeResourcesIterator.remove();
+            }
+        }
+        
+        // add path to delete
+        deletedResources.add(path);
+    }
+    
+    public void revert(ResourceResolver resolver) {
+        changedResources.clear();
+        deletedResources.clear();
+    }
+    
+    public void commit(ResourceResolver resolver) throws PersistenceException {
+        try {
+            for (String path : deletedResources) {
+               adapter.deleteRecursive(path); 
+               notifyRemoved(path);
+            }
+            for (NoSqlData item : changedResources.values()) {
+                boolean created = adapter.store(item);
+                if (created) {
+                    notifyAdded(item.getPath());
+                }
+                else {
+                    notifyUpdated(item.getPath());
+                }
+            }
+        }
+        finally {
+            this.revert(resolver);
+        }
+    }
+    
+    public boolean hasChanges(ResourceResolver resolver) {
+        return !(changedResources.isEmpty() && deletedResources.isEmpty());
+    }
+    
+    private void notifyAdded(String path) {
+        final Dictionary<String, Object> props = new Hashtable<String, Object>();
+        props.put(SlingConstants.PROPERTY_PATH, path);
+        props.put("event.distribute", "");
+        final Event event = new Event(SlingConstants.TOPIC_RESOURCE_ADDED, props);
+        this.eventAdmin.postEvent(event);
+    }
+
+    private void notifyUpdated(String path) {
+        final Dictionary<String, Object> props = new Hashtable<String, Object>();
+        props.put(SlingConstants.PROPERTY_PATH, path);
+        props.put("event.distribute", "");
+        final Event event = new Event(SlingConstants.TOPIC_RESOURCE_CHANGED, props);
+        this.eventAdmin.postEvent(event);
+    }    
+
+    private void notifyRemoved(String path) {
+        final Dictionary<String, Object> props = new Hashtable<String, Object>();
+        props.put(SlingConstants.PROPERTY_PATH, path);
+        props.put("event.distribute", "");
+        final Event event = new Event(SlingConstants.TOPIC_RESOURCE_REMOVED, props);
+        this.eventAdmin.postEvent(event);
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java Fri May 15 16:40:21 2015
@@ -0,0 +1,73 @@
+/*
+ * 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.sling.nosql.generic.resource.impl;
+
+import java.util.Iterator;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+
+class NoSqlQueriableResourceProvider {
+
+    private final NoSqlAdapter adapter;
+    
+    public NoSqlQueriableResourceProvider(NoSqlAdapter adapter) {
+        this.adapter = adapter;
+    }
+
+    public Iterator<Resource> findResources(final ResourceResolver resolver, final String query, final String language) {
+        final Iterator<NoSqlData> result = adapter.query(query, language);
+        if (result == null) {
+            return null;
+        }
+        return new Iterator<Resource>() {
+            public boolean hasNext() {
+                return result.hasNext();
+            }
+            public Resource next() {
+                return new NoSqlResource(result.next(), resolver);
+            }
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        };
+    }
+
+    public Iterator<ValueMap> queryResources(final ResourceResolver resolver, final String query, final String language) {
+        final Iterator<Resource> result = findResources(resolver, query, language);
+        if (result == null) {
+            return null;
+        }
+        return new Iterator<ValueMap>() {
+            public boolean hasNext() {
+                return result.hasNext();
+            }
+            public ValueMap next() {
+                return result.next().getValueMap();
+            }
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        };
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java Fri May 15 16:40:21 2015
@@ -0,0 +1,99 @@
+/*
+ * 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.sling.nosql.generic.resource.impl;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+
+class NoSqlReadonlyResourceProvider implements ResourceProvider {
+
+    private final NoSqlAdapter adapter;
+    private final Map<String, NoSqlData> changedResources;
+    private final Set<String> deletedResources;
+    
+    public NoSqlReadonlyResourceProvider(NoSqlAdapter adapter, Map<String, NoSqlData> changedResources, Set<String> deletedResources) {
+        this.adapter = adapter;
+        this.changedResources = changedResources;
+        this.deletedResources = deletedResources;
+    }
+
+    public Resource getResource(ResourceResolver resourceResolver, String path) {
+        if (this.deletedResources.contains(path)) {
+            return null;
+        }
+        if (this.changedResources.containsKey(path)) {
+            return new NoSqlResource(this.changedResources.get(path), resourceResolver);
+        }
+        NoSqlData data = adapter.get(path);
+        if (data != null) {
+            return new NoSqlResource(data, resourceResolver);
+        }
+        return null;
+    }
+
+    public Resource getResource(ResourceResolver resourceResolver, HttpServletRequest request, String path) {
+        return getResource(resourceResolver, path);
+    }
+
+    public Iterator<Resource> listChildren(Resource parent) {
+        
+        // use map to consolidate data from adapter minus deleted plus changed resources
+        // always sorty result alphabetically to have a consistent ordering - the nosql data source does not support ordering
+        SortedMap<String, Resource> children = new TreeMap<String, Resource>();
+        
+        Iterator<NoSqlData> fromAdapter = adapter.getChildren(parent.getPath());
+        while (fromAdapter.hasNext()) {
+            NoSqlData item = fromAdapter.next();
+            if (isDeleted(item.getPath()) || changedResources.containsKey(item.getPath())) {
+                continue;
+            }
+            children.put(item.getPath(), new NoSqlResource(item, parent.getResourceResolver()));
+        }
+        
+        Pattern childPathPattern = PathUtil.getChildPathPattern(parent.getPath());
+        for (NoSqlData item : changedResources.values()) {
+            if (childPathPattern.matcher(item.getPath()).matches()) {
+                children.put(item.getPath(), new NoSqlResource(item, parent.getResourceResolver()));
+            }
+        }
+        
+        return children.values().iterator();
+    }
+
+    private boolean isDeleted(String path) {
+        for (String deletedPath : deletedResources) {
+            return StringUtils.equals(path, deletedPath) || StringUtils.startsWith(path, deletedPath + "/");
+        }
+        return false;
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java Fri May 15 16:40:21 2015
@@ -0,0 +1,74 @@
+/*
+ * 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.sling.nosql.generic.resource.impl;
+
+import java.util.Map;
+
+import org.apache.sling.api.SlingConstants;
+import org.apache.sling.api.resource.AbstractResource;
+import org.apache.sling.api.resource.ModifiableValueMap;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+
+public class NoSqlResource extends AbstractResource {
+    
+    private final NoSqlData data;
+    private final ResourceResolver resourceResolver;
+    private final ResourceMetadata metadata;
+    
+    public NoSqlResource(NoSqlData data, ResourceResolver resourceResolver) {
+        this.data = data;
+        this.resourceResolver = resourceResolver;
+        this.metadata = new ResourceMetadata();
+    }
+
+    public ResourceResolver getResourceResolver() {
+        return resourceResolver;
+    }
+
+    public String getPath() {
+        return data.getPath();
+    }
+
+    public String getResourceType() {
+        return getValueMap().get(ResourceResolver.PROPERTY_RESOURCE_TYPE, String.class);
+    }
+
+    public String getResourceSuperType() {
+        return getValueMap().get(SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE, String.class);
+    }
+
+    public ResourceMetadata getResourceMetadata() {
+        return metadata;
+    }
+
+    @Override
+    public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+        if (type == ValueMap.class || type == Map.class) {
+            // TODO: implement value map adaption
+        }
+        if (type == ModifiableValueMap.class) {
+            // TODO: implement value map adaption
+        }
+        return super.adaptTo(type);
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java Fri May 15 16:40:21 2015
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.nosql.generic.resource.impl;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.sling.api.resource.ModifyingResourceProvider;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.QueriableResourceProvider;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+import org.osgi.service.event.EventAdmin;
+
+public class NoSqlResourceProvider implements ResourceProvider, ModifyingResourceProvider, QueriableResourceProvider {
+    
+    private final NoSqlReadonlyResourceProvider readonlyDelegate;
+    private final NoSqlModifyingResourceProvider modifyingDelegate;
+    private final NoSqlQueriableResourceProvider queriableDelegate;
+    
+    private final Map<String, NoSqlData> changedResources = new HashMap<String, NoSqlData>();
+    private final Set<String> deletedResources = new HashSet<String>();
+    
+    public NoSqlResourceProvider(NoSqlAdapter adapter, EventAdmin eventAdmin) {
+        this.readonlyDelegate = new NoSqlReadonlyResourceProvider(adapter, changedResources, deletedResources);
+        this.modifyingDelegate = new NoSqlModifyingResourceProvider(adapter, eventAdmin, changedResources, deletedResources);
+        this.queriableDelegate = new NoSqlQueriableResourceProvider(adapter);
+    }
+
+    public Resource getResource(ResourceResolver resourceResolver, String path) {
+        return readonlyDelegate.getResource(resourceResolver, path);
+    }
+
+    public Resource getResource(ResourceResolver resourceResolver, HttpServletRequest request, String path) {
+        return readonlyDelegate.getResource(resourceResolver, request, path);
+    }
+
+    public Iterator<Resource> listChildren(Resource parent) {
+        return readonlyDelegate.listChildren(parent);
+    }
+
+    public Resource create(ResourceResolver resolver, String path, Map<String, Object> properties) throws PersistenceException {
+        return modifyingDelegate.create(resolver, path, properties);
+    }
+
+    public void delete(ResourceResolver resolver, String path) throws PersistenceException {
+        modifyingDelegate.delete(resolver, path);
+    }
+
+    public void revert(ResourceResolver resolver) {
+        modifyingDelegate.revert(resolver);
+    }
+
+    public void commit(ResourceResolver resolver) throws PersistenceException {
+        modifyingDelegate.commit(resolver);
+    }
+
+    public boolean hasChanges(ResourceResolver resolver) {
+        return modifyingDelegate.hasChanges(resolver);
+    }
+
+    public Iterator<Resource> findResources(ResourceResolver resolver, String query, String language) {
+        return queriableDelegate.findResources(resolver, query, language);
+    }
+
+    public Iterator<ValueMap> queryResources(ResourceResolver resolver, String query, String language) {
+        return queryResources(resolver, query, language);
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java Fri May 15 16:40:21 2015
@@ -0,0 +1,47 @@
+/*
+ * 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.sling.nosql.generic.resource.impl;
+
+import java.util.regex.Pattern;
+
+public final class PathUtil {
+
+    private PathUtil() {
+        // static methods only
+    }
+    
+    /**
+     * Generated a regex pattern that accepts all paths that are direct children of the given parent path.
+     * @param parentPath Parent path
+     * @return Regex pattern
+     */
+    public static Pattern getChildPathPattern(String parentPath) {
+        return Pattern.compile("^" + Pattern.quote(parentPath) + "/[^/]+$");
+    }
+    
+    /**
+     * Generated a regex pattern that accepts all paths that are same or descendants of the given parent path.
+     * @param path Path
+     * @return Regex pattern
+     */
+    public static Pattern getSameOrDescendantPathPattern(String path) {
+        return Pattern.compile("^" + Pattern.quote(path) + "(/.*)?$");
+    }
+    
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java Fri May 15 16:40:21 2015
@@ -0,0 +1,56 @@
+/*
+ * 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.sling.nosql.generic.resource;
+
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory;
+import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.service.event.EventAdmin;
+
+import com.google.common.collect.ImmutableMap;
+
+@RunWith(MockitoJUnitRunner.class)
+public class NoSqlResourceProviderFactoryTest {
+    
+    @Rule
+    public SlingContext context = new SlingContext();
+    
+    @Mock
+    private EventAdmin eventAdmin;
+    
+    @Before
+    public void setUp() {
+        context.registerService(EventAdmin.class, eventAdmin);
+        context.registerInjectActivateService(new SimpleNoSqlResourceProviderFactory(), ImmutableMap.<String, Object>builder()
+                .put(ResourceProvider.ROOTS, "/nosql/simple")
+                .build());
+    }
+
+    @Test
+    public void testGetResourceProvider() {
+        // TODO: implement simple test
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java Fri May 15 16:40:21 2015
@@ -0,0 +1,56 @@
+/*
+ * 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.sling.nosql.generic.resource.impl;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+public class PathUtilTest {
+
+    @Test
+    public void testGetChildPathPattern() {
+        Pattern pattern = PathUtil.getChildPathPattern("/my/path");
+        
+        assertFalse(pattern.matcher("/my/path").matches());
+        assertTrue(pattern.matcher("/my/path/child1").matches());
+        assertTrue(pattern.matcher("/my/path/child2").matches());
+        assertFalse(pattern.matcher("/my/path/child1/subchild1").matches());
+        assertFalse(pattern.matcher("/my/path/child1/subchild1/subchild2").matches());
+        assertFalse(pattern.matcher("/my/sibling").matches());
+        assertFalse(pattern.matcher("/other").matches());
+    }
+
+    @Test
+    public void testGetDescendantPathPattern() {
+        Pattern pattern = PathUtil.getSameOrDescendantPathPattern("/my/path");
+        
+        assertTrue(pattern.matcher("/my/path").matches());
+        assertTrue(pattern.matcher("/my/path/child1").matches());
+        assertTrue(pattern.matcher("/my/path/child2").matches());
+        assertTrue(pattern.matcher("/my/path/child1/subchild1").matches());
+        assertTrue(pattern.matcher("/my/path/child1/subchild1/subchild2").matches());
+        assertFalse(pattern.matcher("/my/sibling").matches());
+        assertFalse(pattern.matcher("/other").matches());
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java Fri May 15 16:40:21 2015
@@ -0,0 +1,91 @@
+/*
+ * 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.sling.nosql.generic.simple;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
+
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+import org.apache.sling.nosql.generic.resource.impl.PathUtil;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterators;
+
+public class SimpleNoSqlAdapter implements NoSqlAdapter {
+    
+    private final Map<String, Map<String,Object>> store = new HashMap<String, Map<String,Object>>();
+
+    public NoSqlData get(String path) {
+        Map<String,Object> properties = store.get(path);
+        if (properties != null) {
+            return new NoSqlData(path, properties);
+        }
+        else {
+            return null;
+        }
+    }
+
+    public Iterator<NoSqlData> getChildren(String parentPath) {
+        Iterator<String> keys = store.keySet().iterator();
+        
+        final Pattern childKeyPattern = PathUtil.getChildPathPattern(parentPath);
+        Iterator<String> childKeys = Iterators.filter(keys, new Predicate<String>() {
+            public boolean apply(String path) {
+                return childKeyPattern.matcher(path).matches();
+            }
+        });
+        
+        return Iterators.transform(childKeys, new Function<String, NoSqlData>() {
+            public NoSqlData apply(String path) {
+                return get(path);
+            }
+        });
+    }
+
+    public boolean store(NoSqlData data) {
+        boolean exists = store.containsKey(data.getPath());
+        store.put(data.getPath(), data.getProperties());
+        return !exists;
+    }
+
+    public boolean deleteRecursive(String path) {
+        boolean deletedAnything = false;
+        final Pattern pathToDeletePattern = PathUtil.getSameOrDescendantPathPattern(path);
+        Iterator<Entry<String, Map<String,Object>>> entries = store.entrySet().iterator();
+        while (entries.hasNext()) {
+            Entry<String, Map<String,Object>> entry = entries.next();
+            if (pathToDeletePattern.matcher(entry.getKey()).matches()) {
+                entries.remove();
+                deletedAnything = true;
+            }
+        }
+        return deletedAnything;
+    }
+
+    public Iterator<NoSqlData> query(String query, String language) {
+        // not supported
+        return null;
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java Fri May 15 16:40:21 2015
@@ -0,0 +1,68 @@
+/*
+ * 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.sling.nosql.generic.simple;
+
+import java.util.Map;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceProviderFactory;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.resource.AbstractNoSqlResourceProviderFactory;
+import org.osgi.service.event.EventAdmin;
+
+@Component(configurationFactory = true, policy = ConfigurationPolicy.REQUIRE, metatype = true)
+@Service(value = ResourceProviderFactory.class)
+@Property(name = ResourceProvider.ROOTS, value = "")
+public class SimpleNoSqlResourceProviderFactory extends AbstractNoSqlResourceProviderFactory {
+
+    @Reference
+    private EventAdmin eventAdmin;
+    
+    private NoSqlAdapter noSqlAdapter;
+    
+    @Activate
+    protected void activate(final Map<String, Object> props) {
+        noSqlAdapter = new SimpleNoSqlAdapter();
+    }
+    
+    @Override
+    protected NoSqlAdapter getNoSqlAdapter() {
+        return noSqlAdapter;
+    }
+
+    @Override
+    protected EventAdmin getEventAdmin() {
+        return eventAdmin;
+    }
+    
+    protected void bindEventAdmin(EventAdmin eventAdmin) {
+        this.eventAdmin = eventAdmin;
+    }
+
+    protected void unbindEventAdmin(EventAdmin eventAdmin) {
+        this.eventAdmin = null;
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml Fri May 15 16:40:21 2015
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+    <scr:component name="org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory" configuration-policy="require" activate="activate">
+        <implementation class="org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory"/>
+        <service servicefactory="false">
+            <provide interface="org.apache.sling.api.resource.ResourceProviderFactory"/>
+        </service>
+        <property name="provider.roots" value=""/>
+        <property name="service.vendor" value="The Apache Software Foundation"/>
+        <property name="service.pid" value="org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory"/>
+        <reference name="eventAdmin" interface="org.osgi.service.event.EventAdmin" cardinality="1..1" policy="static" bind="bindEventAdmin" unbind="unbindEventAdmin"/>
+    </scr:component>
+</components>

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain