You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2013/10/30 13:01:34 UTC

svn commit: r1537059 - in /sling/trunk/bundles: scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/

Author: justin
Date: Wed Oct 30 12:01:34 2013
New Revision: 1537059

URL: http://svn.apache.org/r1537059
Log:
SLING-3216 - an event is now posted when a BVP is registered or unregistered which causes the script cache to be cleared

Modified:
    sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java
    sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java

Modified: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java?rev=1537059&r1=1537058&r2=1537059&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java (original)
+++ sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java Wed Oct 30 12:01:34 2013
@@ -23,9 +23,11 @@ import static org.apache.sling.scripting
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 
 import javax.script.ScriptEngineFactory;
 
@@ -33,14 +35,18 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.scripting.api.BindingsValuesProvider;
 import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
 import org.apache.sling.scripting.core.impl.helper.SlingScriptEngineManager;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.Logger;
@@ -53,6 +59,10 @@ public class BindingsValuesProvidersByCo
 
     private final Map<String, ContextBvpCollector> customizers = new HashMap<String, ContextBvpCollector>();
     public static final String [] DEFAULT_CONTEXT_ARRAY = new String [] { DEFAULT_CONTEXT };
+
+    private static final String TOPIC_CREATED = "org/apache/sling/scripting/core/BindingsValuesProvider/CREATED";
+    private static final String TOPIC_MODIFIED = "org/apache/sling/scripting/core/BindingsValuesProvider/MODIFIED";
+    private static final String TOPIC_REMOVED = "org/apache/sling/scripting/core/BindingsValuesProvider/REMOVED";
     
     private ServiceTracker bvpTracker;
     private ServiceTracker mapsTracker;
@@ -62,7 +72,10 @@ public class BindingsValuesProvidersByCo
     
     @Reference
     private SlingScriptEngineManager scriptEngineManager;
-    
+
+    @Reference(policy = ReferencePolicy.DYNAMIC)
+    private EventAdmin eventAdmin;
+
     private abstract class ContextLoop {
         Object apply(ServiceReference ref) {
             final Object service = bundleContext.getService(ref);
@@ -150,11 +163,17 @@ public class BindingsValuesProvidersByCo
 
         return results;
     }
-    
+
     private String [] getContexts(ServiceReference reference) {
         return PropertiesUtil.toStringArray(reference.getProperty(CONTEXT), new String[] { DEFAULT_CONTEXT });
     }
 
+    private Event newEvent(final String topic, final ServiceReference reference) {
+        Dictionary<Object, Object> props = new Properties();
+        props.put("service.id", reference.getProperty(Constants.SERVICE_ID));
+        return new Event(topic, props);
+    }
+
     public Object addingService(final ServiceReference reference) {
         if(bundleContext == null) {
             synchronized (pendingRefs) {
@@ -166,6 +185,9 @@ public class BindingsValuesProvidersByCo
             @Override
             protected void applyInContext(ContextBvpCollector c) {
                 c.addingService(reference);
+                if (eventAdmin != null) {
+                    eventAdmin.postEvent(newEvent(TOPIC_CREATED, reference));
+                }
             }
         }.apply(reference);
     }
@@ -175,6 +197,9 @@ public class BindingsValuesProvidersByCo
             @Override
             protected void applyInContext(ContextBvpCollector c) {
                 c.modifiedService(reference, service);
+                if (eventAdmin != null) {
+                    eventAdmin.postEvent(newEvent(TOPIC_MODIFIED, reference));
+                }
             }
         }.apply(reference);
     }
@@ -190,6 +215,9 @@ public class BindingsValuesProvidersByCo
             @Override
             protected void applyInContext(ContextBvpCollector c) {
                 c.removedService(reference, service);
+                if (eventAdmin != null) {
+                    eventAdmin.postEvent(newEvent(TOPIC_REMOVED, reference));
+                }
             }
         }.apply(reference);
     }

Modified: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java?rev=1537059&r1=1537058&r2=1537059&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java (original)
+++ sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ContextBvpCollector.java Wed Oct 30 12:01:34 2013
@@ -92,9 +92,7 @@ class ContextBvpCollector {
         Object serviceId = ref.getProperty(Constants.SERVICE_ID);
         if (genericBindingsValuesProviders.remove(serviceId) == null) {
             for (Map<Object, BindingsValuesProvider> coll : langBindingsValuesProviders.values()) {
-                if (coll.remove(service) != null) {
-                    return;
-                }
+                coll.remove(serviceId);
             }
         }
     }

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=1537059&r1=1537058&r2=1537059&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java Wed Oct 30 12:01:34 2013
@@ -115,7 +115,8 @@ import org.slf4j.LoggerFactory;
          value={"org/apache/sling/api/resource/Resource/*",
                     "org/apache/sling/api/resource/ResourceProvider/*",
                     "javax/script/ScriptEngineFactory/*",
-                    "org/apache/sling/api/adapter/AdapterFactory/*"})
+                    "org/apache/sling/api/adapter/AdapterFactory/*",
+                    "org/apache/sling/scripting/core/BindingsValuesProvider/*"})
 })
 @Reference(name="Servlet", referenceInterface=javax.servlet.Servlet.class,
            cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
@@ -1079,6 +1080,9 @@ public class SlingServletResolver
                 // adapter factory added or removed: we always flush
                 // as adapting might be transitive
                 flushCache = true;
+            } else if (topic.startsWith("org/apache/sling/scripting/core/BindingsValuesProvider/")) {
+                // bindings values provide factory added or removed: we always flush
+                flushCache = true;
             } else {
                 // this is a resource event