Author: fmeschbe
Date: Tue Nov 22 09:54:57 2011
New Revision: 1204886
URL: http://svn.apache.org/viewvc?rev=1204886&view=rev
Log:
SLING-2296 Make sure the OSGi Event is always sent, regardless of the modified
or added resource is (already) visible or not. This allows us to also use the
sendOsgiEvent method for removal events.
Modified:
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java
Modified:
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java?rev=1204886&r1=1204885&r2=1204886&view=diff
==============================================================================
---
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java
(original)
+++
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java
Tue Nov 22 09:54:57 2011
@@ -182,13 +182,7 @@ public class JcrResourceListener impleme
for (final Entry<String, Event> e : removedEvents.entrySet()) {
// Launch an OSGi event
- final Dictionary<String, String> properties = new
Hashtable<String, String>();
- properties.put(SlingConstants.PROPERTY_PATH,
createWorkspacePath(e.getKey()));
- properties.put(SlingConstants.PROPERTY_USERID,
e.getValue().getUserID());
- if ( this.isExternal(e.getValue()) ) {
- properties.put("event.application", "unknown");
- }
- localEA.postEvent(new
org.osgi.service.event.Event(SlingConstants.TOPIC_RESOURCE_REMOVED,
properties));
+ sendOsgiEvent(e.getKey(), e.getValue(),
SlingConstants.TOPIC_RESOURCE_REMOVED, localEA, null);
}
for (final Entry<String, Event> e : addedEvents.entrySet()) {
@@ -265,6 +259,7 @@ public class JcrResourceListener impleme
/**
* Send an OSGi event based on a JCR Observation Event.
+ *
* @param path The path too the node where the event occurred.
* @param event The JCR observation event.
* @param topic The topic that should be used for the OSGi event.
@@ -272,44 +267,52 @@ public class JcrResourceListener impleme
*/
private void sendOsgiEvent(String path, final Event event, final String
topic, final EventAdmin localEA,
final ChangedAttributes changedAttributes) {
+
path = createWorkspacePath(path);
- Resource resource = this.resolver.getResource(path);
- if ( resource != null ) {
- // check for nt:file nodes
- if ( path.endsWith("/jcr:content") ) {
- final Node node = resource.adaptTo(Node.class);
- if ( node != null ) {
- try {
- if (node.getParent().isNodeType("nt:file") ) {
- final Resource parentResource =
ResourceUtil.getParent(resource);
- if ( parentResource != null ) {
- resource = parentResource;
+
+ final Dictionary<String, Object> properties = new Hashtable<String,
Object>();
+ properties.put(SlingConstants.PROPERTY_PATH, path);
+ properties.put(SlingConstants.PROPERTY_USERID, event.getUserID());
+ if ( this.isExternal(event) ) {
+ properties.put("event.application", "unknown");
+ }
+ if ( changedAttributes != null ) {
+ changedAttributes.addProperties(properties);
+ }
+
+ if (!SlingConstants.TOPIC_RESOURCE_REMOVED.equals(topic)) {
+ Resource resource = this.resolver.getResource(path);
+ if (resource != null) {
+ // check for nt:file nodes
+ if (path.endsWith("/jcr:content")) {
+ final Node node = resource.adaptTo(Node.class);
+ if (node != null) {
+ try {
+ if (node.getParent().isNodeType("nt:file")) {
+ @SuppressWarnings("deprecation")
+ final Resource parentResource =
ResourceUtil.getParent(resource);
+ if (parentResource != null) {
+ resource = parentResource;
+ }
}
+ } catch (RepositoryException re) {
+ // ignore this
}
- } catch (RepositoryException re) {
- // ignore this
}
}
+
+ final String resourceType = resource.getResourceType();
+ if (resourceType != null) {
+ properties.put(SlingConstants.PROPERTY_RESOURCE_TYPE,
resource.getResourceType());
+ }
+ final String resourceSuperType =
resource.getResourceSuperType();
+ if (resourceSuperType != null) {
+
properties.put(SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE,
resource.getResourceSuperType());
+ }
}
- final Dictionary<String, Object> properties = new
Hashtable<String, Object>();
- properties.put(SlingConstants.PROPERTY_PATH, resource.getPath());
- properties.put(SlingConstants.PROPERTY_USERID, event.getUserID());
- final String resourceType = resource.getResourceType();
- if ( resourceType != null ) {
- properties.put(SlingConstants.PROPERTY_RESOURCE_TYPE,
resource.getResourceType());
- }
- final String resourceSuperType = resource.getResourceSuperType();
- if ( resourceSuperType != null ) {
- properties.put(SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE,
resource.getResourceSuperType());
- }
- if ( this.isExternal(event) ) {
- properties.put("event.application", "unknown");
- }
- if ( changedAttributes != null ) {
- changedAttributes.addProperties(properties);
- }
- localEA.postEvent(new org.osgi.service.event.Event(topic,
properties));
}
+
+ localEA.postEvent(new org.osgi.service.event.Event(topic, properties));
}
private boolean isExternal(final Event event) {