You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2012/10/02 11:33:36 UTC
svn commit: r1392811 - in /sling/trunk/contrib/extensions/mongodb: ./
src/main/java/org/apache/sling/mongodb/impl/
Author: cziegeler
Date: Tue Oct 2 09:33:35 2012
New Revision: 1392811
URL: http://svn.apache.org/viewvc?rev=1392811&view=rev
Log:
Send notification events for changes
Modified:
sling/trunk/contrib/extensions/mongodb/pom.xml
sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBContext.java
sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java
sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProviderFactory.java
Modified: sling/trunk/contrib/extensions/mongodb/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/mongodb/pom.xml?rev=1392811&r1=1392810&r2=1392811&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/mongodb/pom.xml (original)
+++ sling/trunk/contrib/extensions/mongodb/pom.xml Tue Oct 2 09:33:35 2012
@@ -76,10 +76,14 @@
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
- <version>2.8.0</version>
+ <version>2.9.1</version>
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
</dependency>
Modified: sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBContext.java?rev=1392811&r1=1392810&r2=1392811&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBContext.java (original)
+++ sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBContext.java Tue Oct 2 09:33:35 2012
@@ -16,20 +16,24 @@
*/
package org.apache.sling.mongodb.impl;
-import java.util.ArrayList;
+import java.util.Dictionary;
import java.util.HashSet;
-import java.util.List;
+import java.util.Hashtable;
import java.util.Set;
+import org.apache.sling.api.SlingConstants;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
import com.mongodb.DB;
public class MongoDBContext {
/** The roots. */
- private final String[] roots;
+ private final String root;
/** The roots ended by a slash. */
- private final String[] rootsWithSlash;
+ private final String rootWithSlash;
/** Don't show these collections. */
private final Set<String> filterCollectionNames = new HashSet<String>();
@@ -37,46 +41,45 @@ public class MongoDBContext {
/** The database to be used. */
private final DB database;
+ private final EventAdmin eventAdmin;
+
public MongoDBContext(final DB database,
- final String[] configuredRoots,
- final String[] configuredFilterCollectionNames) {
+ final String configuredRoot,
+ final String[] configuredFilterCollectionNames,
+ final EventAdmin eventAdmin) {
this.database = database;
- if ( configuredRoots != null ) {
- final List<String> rootsList = new ArrayList<String>();
- final List<String> rootsWithSlashList = new ArrayList<String>();
- for(final String r : configuredRoots) {
- if ( r != null ) {
- final String value = r.trim();
- if ( value.length() > 0 ) {
- if ( value.endsWith("/") ) {
- rootsWithSlashList.add(value);
- rootsList.add(value.substring(0, value.length() - 1));
- } else {
- rootsWithSlashList.add(value + "/");
- rootsList.add(value);
- }
- }
+ if ( configuredRoot != null ) {
+ final String value = configuredRoot.trim();
+ if ( value.length() > 0 ) {
+ if ( value.endsWith("/") ) {
+ this.rootWithSlash = configuredRoot;
+ this.root = configuredRoot.substring(0, configuredRoot.length() - 1);
+ } else {
+ this.rootWithSlash = configuredRoot + "/";
+ this.root = configuredRoot;
}
+ } else {
+ this.root = "";
+ this.rootWithSlash = "/";
}
- this.roots = rootsList.toArray(new String[rootsList.size()]);
- this.rootsWithSlash = rootsWithSlashList.toArray(new String[rootsWithSlashList.size()]);
} else {
- this.roots = new String[0];
- this.rootsWithSlash = new String[0];
+ this.root = "";
+ this.rootWithSlash = "/";
}
if ( configuredFilterCollectionNames != null ) {
for(final String name : configuredFilterCollectionNames) {
this.filterCollectionNames.add(name);
}
}
+ this.eventAdmin = eventAdmin;
}
- public String[] getRoots() {
- return roots;
+ public String getRoot() {
+ return root;
}
- public String[] getRootsWithSlash() {
- return this.rootsWithSlash;
+ public String getRootWithSlash() {
+ return this.rootWithSlash;
}
public boolean isFilterCollectionName(final String name) {
@@ -90,4 +93,25 @@ public class MongoDBContext {
public DB getDatabase() {
return this.database;
}
+
+ public void notifyRemoved(final String[] info) {
+ final Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(SlingConstants.PROPERTY_PATH, this.rootWithSlash + info[0] + '/' + info[1]);
+ final Event event = new Event(SlingConstants.TOPIC_RESOURCE_REMOVED, props);
+ this.eventAdmin.postEvent(event);
+ }
+
+ public void notifyAddeed(final String[] info) {
+ final Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(SlingConstants.PROPERTY_PATH, this.rootWithSlash + info[0] + '/' + info[1]);
+ final Event event = new Event(SlingConstants.TOPIC_RESOURCE_ADDED, props);
+ this.eventAdmin.postEvent(event);
+ }
+
+ public void notifyUpdated(final String[] info) {
+ final Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(SlingConstants.PROPERTY_PATH, this.rootWithSlash + info[0] + '/' + info[1]);
+ final Event event = new Event(SlingConstants.TOPIC_RESOURCE_CHANGED, props);
+ this.eventAdmin.postEvent(event);
+ }
}
Modified: sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java?rev=1392811&r1=1392810&r2=1392811&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java (original)
+++ sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProvider.java Tue Oct 2 09:33:35 2012
@@ -86,7 +86,7 @@ public class MongoDBResourceProvider imp
* @see org.apache.sling.api.resource.ModifyingResourceProvider#create(org.apache.sling.api.resource.ResourceResolver, java.lang.String, java.util.Map)
*/
public Resource create(final ResourceResolver resolver, final String path, final Map<String, Object> properties)
- throws PersistenceException {
+ throws PersistenceException {
final String[] info = this.extractResourceInfo(path);
if ( info != null && info.length == 2) {
final boolean deleted = this.deletedResources.remove(path);
@@ -122,7 +122,7 @@ public class MongoDBResourceProvider imp
* @see org.apache.sling.api.resource.ModifyingResourceProvider#delete(org.apache.sling.api.resource.ResourceResolver, java.lang.String)
*/
public void delete(final ResourceResolver resolver, final String path)
- throws PersistenceException {
+ throws PersistenceException {
final String[] info = this.extractResourceInfo(path);
if ( info != null ) {
boolean deletedResource = false;
@@ -183,20 +183,26 @@ public class MongoDBResourceProvider imp
// 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());
+ if ( col.findAndRemove(QueryBuilder.start(PROP_PATH).is(info[1]).get()) != null ) {
+ this.context.notifyRemoved(info);
+ }
}
}
for(final MongoDBResource changed : this.changedResources.values()) {
final DBCollection col = this.context.getDatabase().getCollection(changed.getCollection());
if ( col != null ) {
+ final String[] info = new String[] {changed.getCollection(),
+ changed.getProperties().get(PROP_PATH).toString()};
// create or update?
if ( changed.getProperties().get(PROP_ID) != null ) {
col.update(QueryBuilder.start(PROP_PATH).is(changed.getProperties().get(PROP_PATH)).get(),
- changed.getProperties());
+ changed.getProperties());
+ this.context.notifyUpdated(info);
} else {
// create
col.save(changed.getProperties());
+ this.context.notifyUpdated(info);
}
} else {
throw new PersistenceException("Unable to create collection " + changed.getCollection(), null, changed.getPath(), null);
@@ -279,7 +285,7 @@ public class MongoDBResourceProvider imp
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());
+ sort(BasicDBObjectBuilder.start(PROP_PATH, 1).get());
return new Iterator<Resource>() {
public boolean hasNext() {
@@ -297,10 +303,10 @@ public class MongoDBResourceProvider imp
name = objPath.substring(lastSlash + 1);
}
return new MongoDBResource(parent.getResourceResolver(),
- parent.getPath() + '/' + name,
- info[0],
- obj,
- MongoDBResourceProvider.this);
+ parent.getPath() + '/' + name,
+ info[0],
+ obj,
+ MongoDBResourceProvider.this);
}
public void remove() {
@@ -318,8 +324,8 @@ public class MongoDBResourceProvider imp
*/
@SuppressWarnings("javadoc")
public Resource getResource(final ResourceResolver resourceResolver,
- final HttpServletRequest request,
- final String path) {
+ final HttpServletRequest request,
+ final String path) {
return this.getResource(resourceResolver, path);
}
@@ -327,27 +333,25 @@ public class MongoDBResourceProvider imp
* Extract info about collection and path
*/
private String[] extractResourceInfo(final String path) {
- for(final String root : this.context.getRootsWithSlash()) {
- if ( path.startsWith(root) ) {
- if ( path.length() == root.length() ) {
- // special resource - show all collections
- return new String[0];
- }
- final String info = path.substring(root.length());
- final int slashPos = info.indexOf('/');
- if ( slashPos != -1 ) {
- return new String[] {info.substring(0, slashPos), info.substring(slashPos + 1)};
- }
- // special resource - collection
- return new String[] {info};
- }
- }
- for(final String root : this.context.getRoots()) {
- if ( path.equals(root) ) {
+ if ( path.startsWith(this.context.getRootWithSlash()) ) {
+ if ( path.length() == this.context.getRootWithSlash().length() ) {
// special resource - show all collections
return new String[0];
}
+ final String info = path.substring(this.context.getRootWithSlash().length());
+ final int slashPos = info.indexOf('/');
+ if ( slashPos != -1 ) {
+ return new String[] {info.substring(0, slashPos), info.substring(slashPos + 1)};
+ }
+ // special resource - collection
+ return new String[] {info};
+ }
+
+ if ( path.equals(this.context.getRoot()) ) {
+ // special resource - show all collections
+ return new String[0];
}
+
return null;
}
@@ -390,10 +394,10 @@ public class MongoDBResourceProvider imp
logger.debug("Found {}", obj);
if ( obj != null ) {
return new MongoDBResource(resourceResolver,
- path,
- info[0],
- obj,
- this);
+ path,
+ info[0],
+ obj,
+ this);
}
}
Modified: sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProviderFactory.java?rev=1392811&r1=1392810&r2=1392811&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProviderFactory.java (original)
+++ sling/trunk/contrib/extensions/mongodb/src/main/java/org/apache/sling/mongodb/impl/MongoDBResourceProviderFactory.java Tue Oct 2 09:33:35 2012
@@ -24,11 +24,13 @@ import org.apache.felix.scr.annotations.
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.PropertyUnbounded;
+import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
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.commons.osgi.PropertiesUtil;
+import org.osgi.service.event.EventAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,10 +42,10 @@ import com.mongodb.Mongo;
* in MongoDB.
*/
@Component(label="%factory.name",
- description="%factory.description",
- configurationFactory=true,
- policy=ConfigurationPolicy.REQUIRE,
- metatype=true)
+description="%factory.description",
+configurationFactory=true,
+policy=ConfigurationPolicy.REQUIRE,
+metatype=true)
@Service(value=ResourceProviderFactory.class)
@Properties({
@Property(name=ResourceProvider.ROOTS, value="/mongo")
@@ -74,21 +76,35 @@ public class MongoDBResourceProviderFact
/** The global context passed to each resource provider. */
private MongoDBContext context;
+ @Reference
+ private EventAdmin eventAdmin;
+
@Activate
protected void activate(final Map<String, Object> props) throws Exception {
+ final String[] roots = PropertiesUtil.toStringArray(props.get(ResourceProvider.ROOTS));
+ if ( roots == null || roots.length == 0 ) {
+ throw new Exception("Roots configuration is missing.");
+ }
+ if ( roots.length > 1 ) {
+ throw new Exception("Only a single root should be configured.");
+ }
+ if ( roots[0] == null || roots[0].trim().length() == 0 ) {
+ throw new Exception("Roots configuration is missing.");
+ }
final String host = PropertiesUtil.toString(props.get(PROP_HOST), DEFAULT_HOST);
final int port = PropertiesUtil.toInteger(props.get(PROP_PORT), DEFAULT_PORT);
final String db = PropertiesUtil.toString(props.get(PROP_DB), DEFAULT_DB);
logger.info("Starting MongoDB resource provider with host={}, port={}, db={}",
- new Object[] {host, port, db});
+ new Object[] {host, port, db});
final Mongo m = new Mongo( host , port );
final DB database = m.getDB( db );
logger.info("Connected to database {}", database);
this.context = new MongoDBContext(database,
- PropertiesUtil.toStringArray(props.get(ResourceProvider.ROOTS)),
- PropertiesUtil.toStringArray(props.get(PROP_FILTER_COLLECTIONS)));
+ roots[0],
+ PropertiesUtil.toStringArray(props.get(PROP_FILTER_COLLECTIONS)),
+ this.eventAdmin);
}
/**