You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/10/18 23:24:51 UTC
[sling-org-apache-sling-mongodb] 03/36: New MongoDB resource
provider
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-mongodb.git
commit b786d7367e33fe3c1ef90a85f74b7454c1342e0b
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Wed Aug 1 18:42:28 2012 +0000
New MongoDB resource provider
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1368189 13f79535-47bb-0310-9956-ffa450edef68
---
.../sling/mongodb/impl/ChangeableValueMap.java | 16 +-
.../mongodb/impl/MongoDBResourceProvider.java | 177 +++++++++++++--------
.../sling/mongodb/impl/ReadableValueMap.java | 16 +-
3 files changed, 116 insertions(+), 93 deletions(-)
diff --git a/src/main/java/org/apache/sling/mongodb/impl/ChangeableValueMap.java b/src/main/java/org/apache/sling/mongodb/impl/ChangeableValueMap.java
index 493a737..5cc08b5 100644
--- a/src/main/java/org/apache/sling/mongodb/impl/ChangeableValueMap.java
+++ b/src/main/java/org/apache/sling/mongodb/impl/ChangeableValueMap.java
@@ -43,12 +43,8 @@ public class ChangeableValueMap
*/
public Object put(final String name, final Object value) {
final Object oldValue = this.valueMap.get(name);
- final String key;
- if ( name.startsWith("_") ) {
- key = "_" + name;
- } else {
- key = name;
- }
+ final String key = MongoDBResourceProvider.propNameToKey(name);
+
this.resource.getProperties().put(key, value);
// update map and resource
@@ -73,12 +69,8 @@ public class ChangeableValueMap
public Object remove(final Object name) {
final Object result = this.valueMap.get(name);
if ( result != null ) {
- final String key;
- if ( name.toString().startsWith("_") ) {
- key = "_" + name;
- } else {
- key = name.toString();
- }
+ final String key = MongoDBResourceProvider.propNameToKey(name.toString());
+
this.resource.getProperties().removeField(key);
// update map and resource
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 86a31c5..7ccbaf1 100644
--- a/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java
+++ b/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java
@@ -66,6 +66,22 @@ public class MongoDBResourceProvider implements ResourceProvider, ModifyingResou
this.context = context;
}
+ public static String propNameToKey(final String name) {
+ if ( name.startsWith("_") ) {
+ return "_" + name;
+ }
+ return name;
+ }
+
+ public static String keyToPropName(final String key) {
+ if ( key.startsWith("__") ) {
+ return key.substring(1);
+ } else if ( key.startsWith("_") ) {
+ return null;
+ }
+ return key;
+ }
+
/**
* @see org.apache.sling.api.resource.ModifyingResourceProvider#create(org.apache.sling.api.resource.ResourceResolver, java.lang.String, java.util.Map)
*/
@@ -82,12 +98,7 @@ public class MongoDBResourceProvider implements ResourceProvider, ModifyingResou
dbObj.put(PROP_PATH, info[1]);
if ( properties != null ) {
for(Map.Entry<String, Object> entry : properties.entrySet()) {
- final String key;
- if ( entry.getKey().startsWith("_") ) {
- key = "_" + entry.getKey();
- } else {
- key = entry.getKey();
- }
+ final String key = propNameToKey(entry.getKey());
dbObj.put(key, entry.getValue());
}
}
@@ -107,12 +118,33 @@ public class MongoDBResourceProvider implements ResourceProvider, ModifyingResou
*/
public void delete(final ResourceResolver resolver, final String path)
throws PersistenceException {
- final Resource rsrc = this.getResource(resolver, path);
- if ( rsrc != null ) {
- // TODO - delete all child resources!
- this.deletedResources.add(path);
- this.changedResources.remove(path);
+ 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);
+
+ 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);
+ }
+ return;
+ }
+
+ }
+ throw new PersistenceException("Unable to delete resource at {}" + path, null, path, null);
}
/**
@@ -131,12 +163,10 @@ public class MongoDBResourceProvider implements ResourceProvider, ModifyingResou
for(final String deleted : this.deletedResources) {
final String[] info = this.extractResourceInfo(deleted);
- // check if the database still exists
- if ( this.hasDatabase(info[0]) ) {
- final DBCollection col = this.context.getDatabase().getCollection(info[0]);
- if ( col != null ) {
- col.findAndRemove(QueryBuilder.start(PROP_PATH).is(info[1]).get());
- }
+ // check if the collection still exists
+ final DBCollection col = this.getCollection(info[0]);
+ if ( col != null ) {
+ col.findAndRemove(QueryBuilder.start(PROP_PATH).is(info[1]).get());
}
}
for(final MongoDBResource changed : this.changedResources.values()) {
@@ -217,48 +247,46 @@ public class MongoDBResourceProvider implements ResourceProvider, ModifyingResou
};
}
- if ( this.hasDatabase(info[0]) ) {
- final DBCollection col = this.context.getDatabase().getCollection(info[0]);
- if ( col != null ) {
- final String pattern;
- if ( info.length == 1 ) {
- pattern = "^([^/])*$";
- } else {
- pattern = "^" + Pattern.quote(info[1]) + "/([^/])*$";
- }
+ final DBCollection col = this.getCollection(info[0]);
+ if ( col != null ) {
+ final String pattern;
+ if ( info.length == 1 ) {
+ pattern = "^([^/])*$";
+ } else {
+ pattern = "^" + Pattern.quote(info[1]) + "/([^/])*$";
+ }
- final DBObject query = QueryBuilder.start(PROP_PATH).regex(Pattern.compile(pattern)).get();
- final DBCursor cur = col.find(query).
- sort(BasicDBObjectBuilder.start(PROP_PATH, 1).get());
- return new Iterator<Resource>() {
+ final DBObject query = QueryBuilder.start(PROP_PATH).regex(Pattern.compile(pattern)).get();
+ final DBCursor cur = col.find(query).
+ sort(BasicDBObjectBuilder.start(PROP_PATH, 1).get());
+ return new Iterator<Resource>() {
- public boolean hasNext() {
- return cur.hasNext();
- }
+ public boolean hasNext() {
+ return cur.hasNext();
+ }
- public Resource next() {
- final DBObject obj = cur.next();
- final String objPath = obj.get(PROP_PATH).toString();
- final int lastSlash = objPath.lastIndexOf('/');
- final String name;
- if (lastSlash == -1) {
- name = objPath;
- } else {
- name = objPath.substring(lastSlash + 1);
- }
- return new MongoDBResource(parent.getResourceResolver(),
- parent.getPath() + '/' + name,
- info[0],
- obj,
- MongoDBResourceProvider.this);
+ public Resource next() {
+ final DBObject obj = cur.next();
+ final String objPath = obj.get(PROP_PATH).toString();
+ final int lastSlash = objPath.lastIndexOf('/');
+ final String name;
+ if (lastSlash == -1) {
+ name = objPath;
+ } else {
+ name = objPath.substring(lastSlash + 1);
}
+ return new MongoDBResource(parent.getResourceResolver(),
+ parent.getPath() + '/' + name,
+ info[0],
+ obj,
+ MongoDBResourceProvider.this);
+ }
- public void remove() {
- throw new UnsupportedOperationException("remove");
- }
+ public void remove() {
+ throw new UnsupportedOperationException("remove");
+ }
- };
- }
+ };
}
}
return null;
@@ -303,15 +331,25 @@ public class MongoDBResourceProvider implements ResourceProvider, ModifyingResou
}
/**
- * Check if a database with a given name exists
+ * Check if a collection with a given name exists
*/
- private boolean hasDatabase(final String name) {
+ private boolean hasCollection(final String name) {
final Set<String> names = this.context.getDatabase().getCollectionNames();
return names.contains(name) && !this.context.isFilterCollectionName(name);
}
/**
- * Create a resource
+ * Check if a collection with a given name exists and return it
+ */
+ private DBCollection getCollection(final String name) {
+ if ( this.hasCollection(name) ) {
+ return this.context.getDatabase().getCollection(name);
+ }
+ return null;
+ }
+
+ /**
+ * Get a resource
*/
private Resource getResource(final ResourceResolver resourceResolver, final String path, final String[] info) {
if ( info.length == 0 ) {
@@ -319,26 +357,25 @@ public class MongoDBResourceProvider implements ResourceProvider, ModifyingResou
return new MongoDBCollectionResource(resourceResolver, path);
} else if ( info.length == 1 ) {
// special resource : collection
- if ( this.hasDatabase(info[0]) ) {
+ if ( this.hasCollection(info[0]) ) {
return new MongoDBCollectionResource(resourceResolver, path);
}
return null;
}
- logger.info("Searching {} in {}", info[1], info[0]);
- if ( this.hasDatabase(info[0]) ) {
- final DBCollection col = this.context.getDatabase().getCollection(info[0]);
- if ( col != null ) {
- final DBObject obj = col.findOne(QueryBuilder.start(PROP_PATH).is(info[1]).get());
- logger.info("Result={}", obj);
- if ( obj != null ) {
- return new MongoDBResource(resourceResolver,
- path,
- info[0],
- obj,
- this);
- }
+ logger.debug("Searching {} in {}", info[1], info[0]);
+ final DBCollection col = this.getCollection(info[0]);
+ if ( col != null ) {
+ final DBObject obj = col.findOne(QueryBuilder.start(PROP_PATH).is(info[1]).get());
+ logger.debug("Found {}", obj);
+ if ( obj != null ) {
+ return new MongoDBResource(resourceResolver,
+ path,
+ info[0],
+ obj,
+ this);
}
}
+
return null;
}
diff --git a/src/main/java/org/apache/sling/mongodb/impl/ReadableValueMap.java b/src/main/java/org/apache/sling/mongodb/impl/ReadableValueMap.java
index 8da52d8..5bc0f15 100644
--- a/src/main/java/org/apache/sling/mongodb/impl/ReadableValueMap.java
+++ b/src/main/java/org/apache/sling/mongodb/impl/ReadableValueMap.java
@@ -20,7 +20,6 @@ import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -39,16 +38,11 @@ public class ReadableValueMap implements ValueMap {
}
protected void createValueMap(final DBObject dbObject) {
- @SuppressWarnings("unchecked")
- final Map<String, Object> map = new HashMap<String, Object>(dbObject.toMap());
- final Set<String> names = new HashSet<String>(map.keySet());
- for(final String name : names) {
- if ( name.startsWith("__") ) {
- final Object value = map.remove(name);
- map.put(name.substring(1), value);
- } else if ( name.startsWith("_") ) {
- // remove internal props, like _id, _path
- map.remove(name);
+ final Map<String, Object> map = new HashMap<String, Object>();
+ for(final Map.Entry<String, Object> entry : map.entrySet()) {
+ final String name = MongoDBResourceProvider.keyToPropName(entry.getKey());
+ if ( name != null ) {
+ map.put(name, entry.getValue());
}
}
this.valueMap = Collections.unmodifiableMap(map);
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.