Author: bdelacretaz
Date: Wed Sep  4 14:50:41 2013
New Revision: 1520039

URL: http://svn.apache.org/r1520039
Log:
SLING-3038 - extract BindingsValuesProviderCustomizer to make it testable

Added:
    
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProviderCustomizer.java
   (with props)
Modified:
    
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java

Added: 
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProviderCustomizer.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProviderCustomizer.java?rev=1520039&view=auto
==============================================================================
--- 
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProviderCustomizer.java
 (added)
+++ 
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProviderCustomizer.java
 Wed Sep  4 14:50:41 2013
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.scripting.core.impl;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.script.Bindings;
+import javax.script.ScriptEngine;
+
+import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.apache.sling.scripting.api.BindingsValuesProvider;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/** ServiceTrackerCustomizer used to track our BindingsValuesProviders */
+class BindingsValuesProviderCustomizer implements ServiceTrackerCustomizer {
+    
+    /** list of service property values which indicate 'any' script engine */
+    private static final List<String> ANY_ENGINE = Arrays.asList("*", "ANY");
+
+    private final BundleContext bundleContext;
+    
+    /**
+     * The BindingsValuesProvider impls which apply to all languages. Keys are 
serviceIds.
+     */
+    private final Map<Object, BindingsValuesProvider> 
genericBindingsValuesProviders;
+
+    /**
+     * The BindingsValuesProvider impls which apply to a specific language.
+     */
+    private final Map<String, Map<Object, BindingsValuesProvider>> 
langBindingsValuesProviders;
+    
+    BindingsValuesProviderCustomizer(BundleContext bc) {
+        bundleContext = bc;
+        genericBindingsValuesProviders = new ConcurrentHashMap<Object, 
BindingsValuesProvider>();
+        langBindingsValuesProviders = new ConcurrentHashMap<String, 
Map<Object, BindingsValuesProvider>>();
+    }
+
+    @SuppressWarnings("unchecked")
+    public Object addingService(final ServiceReference ref) {
+        final String[] engineNames = PropertiesUtil
+                .toStringArray(ref.getProperty(ScriptEngine.NAME), new 
String[0]);
+        final Object serviceId = ref.getProperty(Constants.SERVICE_ID);
+        Object service = bundleContext.getService(ref);
+        if (service != null) {
+            if (service instanceof Map) {
+                service = new MapWrappingBindingsValuesProvider((Map<String, 
Object>) service);
+            }
+            if (engineNames.length == 0) {
+                genericBindingsValuesProviders.put(serviceId, 
(BindingsValuesProvider) service);
+            } else if (engineNames.length == 1 && 
ANY_ENGINE.contains(engineNames[0].toUpperCase())) {
+                genericBindingsValuesProviders.put(serviceId, 
(BindingsValuesProvider) service);
+            } else {
+                for (String engineName : engineNames) {
+                    Map<Object, BindingsValuesProvider> langProviders = 
langBindingsValuesProviders.get(engineName);
+                    if (langProviders == null) {
+                        langProviders = new ConcurrentHashMap<Object, 
BindingsValuesProvider>();
+                        langBindingsValuesProviders.put(engineName, 
langProviders);
+                    }
+
+                    langProviders.put(serviceId, (BindingsValuesProvider) 
service);
+                }
+            }
+        }
+        return service;
+    }
+
+    public void modifiedService(final ServiceReference ref, final Object 
service) {
+        removedService(ref, service);
+        addingService(ref);
+    }
+
+    public void removedService(final ServiceReference ref, final Object 
service) {
+        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;
+                }
+            }
+        }
+    }
+    
+    Map<Object, BindingsValuesProvider> getGenericBindingsValuesProviders() {
+        return genericBindingsValuesProviders;
+    }
+
+    Map<String, Map<Object, BindingsValuesProvider>> 
getLangBindingsValuesProviders() {
+        return langBindingsValuesProviders;
+    }
+
+    private class MapWrappingBindingsValuesProvider implements 
BindingsValuesProvider {
+
+        private Map<String,Object> map;
+
+        MapWrappingBindingsValuesProvider(Map<String, Object> map) {
+            this.map = map;
+        }
+
+        public void addBindings(Bindings bindings) {
+            for (String key : map.keySet()) {
+                bindings.put(key, map.get(key));
+            }
+        }
+
+    }
+
+}
\ No newline at end of file

Propchange: 
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProviderCustomizer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProviderCustomizer.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: 
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java?rev=1520039&r1=1520038&r2=1520039&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
 (original)
+++ 
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
 Wed Sep  4 14:50:41 2013
@@ -17,13 +17,10 @@
 package org.apache.sling.scripting.core.impl;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
-import javax.script.Bindings;
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineFactory;
 
@@ -39,13 +36,10 @@ import org.apache.sling.commons.osgi.Pro
 import org.apache.sling.scripting.api.BindingsValuesProvider;
 import org.apache.sling.scripting.core.impl.helper.SlingScriptEngineManager;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
 import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,9 +61,6 @@ public class SlingScriptAdapterFactory i
 
     private final Logger log = 
LoggerFactory.getLogger(SlingScriptAdapterFactory.class);
 
-    /** list of service property values which indicate 'any' script engine */
-    private static final List<String> ANY_ENGINE = Arrays.asList("*", "ANY");
-
     private BundleContext bundleContext;
 
     /**
@@ -83,16 +74,6 @@ public class SlingScriptAdapterFactory i
     private ServiceTracker mapBindingsValuesProviderTracker;
 
     /**
-     * The BindingsValuesProvider impls which apply to all languages. Keys are 
serviceIds.
-     */
-    private Map<Object, BindingsValuesProvider> genericBindingsValuesProviders;
-
-    /**
-     * The BindingsValuesProvider impls which apply to a specific language.
-     */
-    private Map<String, Map<Object, BindingsValuesProvider>> 
langBindingsValuesProviders;
-
-    /**
      * The service cache for script execution.
      */
     private ServiceCache serviceCache;
@@ -102,6 +83,11 @@ public class SlingScriptAdapterFactory i
      */
     @Reference
     private SlingScriptEngineManager scriptEngineManager;
+    
+    /**
+     * The customizer for BindingsValuesProvider service trackers
+     */
+    private BindingsValuesProviderCustomizer bindingsValuesProviderCustomizer;
 
     // ---------- AdapterFactory 
-----------------------------------------------
 
@@ -174,21 +160,17 @@ public class SlingScriptAdapterFactory i
     // ---------- SCR integration 
----------------------------------------------
 
     protected void activate(ComponentContext context) {
-        this.bundleContext = context.getBundleContext();
+        bundleContext = context.getBundleContext();
+        bindingsValuesProviderCustomizer = new 
BindingsValuesProviderCustomizer(bundleContext);
 
-        this.genericBindingsValuesProviders = new ConcurrentHashMap<Object, 
BindingsValuesProvider>();
-        this.langBindingsValuesProviders = new ConcurrentHashMap<String, 
Map<Object, BindingsValuesProvider>>();
-
-        ServiceTrackerCustomizer customizer = new 
BindingsValuesProviderCustomizer();
-
-        this.bindingsValuesProviderTracker = new 
ServiceTracker(this.bundleContext, BindingsValuesProvider.class.getName(), 
customizer);
+        this.bindingsValuesProviderTracker = new 
ServiceTracker(this.bundleContext, BindingsValuesProvider.class.getName(), 
bindingsValuesProviderCustomizer);
         this.bindingsValuesProviderTracker.open();
 
         try {
             Filter filter = 
this.bundleContext.createFilter(String.format("(&(objectclass=%s)(javax.script.name=*))",
                     Map.class.getName()));
 
-            this.mapBindingsValuesProviderTracker = new 
ServiceTracker(this.bundleContext, filter, customizer);
+            this.mapBindingsValuesProviderTracker = new 
ServiceTracker(this.bundleContext, filter, bindingsValuesProviderCustomizer);
             this.mapBindingsValuesProviderTracker.open();
         } catch (InvalidSyntaxException e) {
             log.warn("Unable to create ServiceTracker for Map-based script 
bindiings", e);
@@ -213,7 +195,7 @@ public class SlingScriptAdapterFactory i
 
     private Collection<BindingsValuesProvider> 
getBindingsValuesProviders(ScriptEngineFactory scriptEngineFactory) {
         final List<BindingsValuesProvider> results = new 
ArrayList<BindingsValuesProvider>();
-        results.addAll(genericBindingsValuesProviders.values());
+        
results.addAll(bindingsValuesProviderCustomizer.getGenericBindingsValuesProviders().values());
 
         // we load the compatible language ones first so that the most specific
         // overrides these
@@ -221,7 +203,7 @@ public class SlingScriptAdapterFactory i
         if (factoryProps != null) {
             String[] compatibleLangs = 
PropertiesUtil.toStringArray(factoryProps.get("compatible.javax.script.name"), 
new String[0]);
             for (final String name : compatibleLangs) {
-                final Map<Object, BindingsValuesProvider> langProviders = 
langBindingsValuesProviders.get(name);
+                final Map<Object, BindingsValuesProvider> langProviders = 
bindingsValuesProviderCustomizer.getLangBindingsValuesProviders().get(name);
                 if (langProviders != null) {
                     results.addAll(langProviders.values());
                 }
@@ -229,7 +211,7 @@ public class SlingScriptAdapterFactory i
         }
 
         for (final String name : scriptEngineFactory.getNames()) {
-            final Map<Object, BindingsValuesProvider> langProviders = 
langBindingsValuesProviders.get(name);
+            final Map<Object, BindingsValuesProvider> langProviders = 
bindingsValuesProviderCustomizer.getLangBindingsValuesProviders().get(name);
             if (langProviders != null) {
                 results.addAll(langProviders.values());
             }
@@ -237,70 +219,4 @@ public class SlingScriptAdapterFactory i
 
         return results;
     }
-
-    private class BindingsValuesProviderCustomizer implements 
ServiceTrackerCustomizer {
-
-        @SuppressWarnings("unchecked")
-        public Object addingService(final ServiceReference ref) {
-            final String[] engineNames = PropertiesUtil
-                    .toStringArray(ref.getProperty(ScriptEngine.NAME), new 
String[0]);
-            final Object serviceId = ref.getProperty(Constants.SERVICE_ID);
-            Object service = bundleContext.getService(ref);
-            if (service != null) {
-                if (service instanceof Map) {
-                    service = new 
MapWrappingBindingsValuesProvider((Map<String, Object>) service);
-                }
-                if (engineNames.length == 0) {
-                    genericBindingsValuesProviders.put(serviceId, 
(BindingsValuesProvider) service);
-                } else if (engineNames.length == 1 && 
ANY_ENGINE.contains(engineNames[0].toUpperCase())) {
-                    genericBindingsValuesProviders.put(serviceId, 
(BindingsValuesProvider) service);
-                } else {
-                    for (String engineName : engineNames) {
-                        Map<Object, BindingsValuesProvider> langProviders = 
langBindingsValuesProviders.get(engineName);
-                        if (langProviders == null) {
-                            langProviders = new ConcurrentHashMap<Object, 
BindingsValuesProvider>();
-                            langBindingsValuesProviders.put(engineName, 
langProviders);
-                        }
-
-                        langProviders.put(serviceId, (BindingsValuesProvider) 
service);
-                    }
-                }
-            }
-            return service;
-        }
-
-        public void modifiedService(final ServiceReference ref, final Object 
service) {
-            removedService(ref, service);
-            addingService(ref);
-        }
-
-        public void removedService(final ServiceReference ref, final Object 
service) {
-            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;
-                    }
-                }
-            }
-        }
-
-    }
-
-    private class MapWrappingBindingsValuesProvider implements 
BindingsValuesProvider {
-
-        private Map<String,Object> map;
-
-        MapWrappingBindingsValuesProvider(Map<String, Object> map) {
-            this.map = map;
-        }
-
-        public void addBindings(Bindings bindings) {
-            for (String key : map.keySet()) {
-                bindings.put(key, map.get(key));
-            }
-        }
-
-    }
-
 }


Reply via email to