New MongoDB resource provider

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1368356 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java b/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java
index 8bea67a..c35a8f1 100644
--- a/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java
+++ b/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java
@@ -118,27 +118,39 @@
      */
     public void delete(final ResourceResolver resolver, final String path)
     throws PersistenceException {
-        if ( deletedResources.contains(path) ) {
-            return;
-        }
-
         final String[] info = this.extractResourceInfo(path);
         if ( info != null ) {
-            final Resource rsrc = this.getResource(resolver, path, info);
-            if ( rsrc instanceof MongoDBResource ) {
-                this.deletedResources.add(path);
-                this.changedResources.remove(path);
+            boolean deletedResource = false;
+            if ( !deletedResources.contains(path) ) {
+                final Resource rsrc = this.getResource(resolver, path, info);
+                if ( rsrc instanceof MongoDBResource ) {
+                    this.deletedResources.add(path);
+                    this.changedResources.remove(path);
 
-                final DBCollection col = this.getCollection(info[0]);
-                final String pattern = "^" + Pattern.quote(info[1]) + "/";
+                    final DBCollection col = this.getCollection(info[0]);
+                    final String pattern = "^" + Pattern.quote(info[1]) + "/";
 
-                final DBObject query = QueryBuilder.start(PROP_PATH).regex(Pattern.compile(pattern)).get();
-                final DBCursor cur = col.find(query);
-                while ( cur.hasNext() ) {
-                    final DBObject dbObj = cur.next();
-                    final String childPath = info[0] + '/' + dbObj.get(PROP_PATH);
-                    this.deletedResources.add(childPath);
-                    this.changedResources.remove(childPath);
+                    final DBObject query = QueryBuilder.start(PROP_PATH).regex(Pattern.compile(pattern)).get();
+                    final DBCursor cur = col.find(query);
+                    while ( cur.hasNext() ) {
+                        final DBObject dbObj = cur.next();
+                        final String childPath = info[0] + '/' + dbObj.get(PROP_PATH);
+                        this.deletedResources.add(childPath);
+                        this.changedResources.remove(childPath);
+                    }
+                    deletedResource = true;
+                }
+            } else {
+                deletedResource = true;
+            }
+            if ( deletedResource ) {
+                final String prefix = path + "/";
+                final Iterator<Map.Entry<String, MongoDBResource>> i = this.changedResources.entrySet().iterator();
+                while ( i.hasNext() ) {
+                    final Map.Entry<String, MongoDBResource> entry = i.next();
+                    if ( entry.getKey().startsWith(prefix) ) {
+                        i.remove();
+                    }
                 }
                 return;
             }