You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2019/09/13 10:16:50 UTC

[sling-org-apache-sling-scripting-core] 04/04: SLING-8705 Manage factory service properties via SortableScriptEngineFactory

This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-core.git

commit 438db9a49f7ffa1eb170d7d293d188eb09e487b4
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Sep 13 12:16:12 2019 +0200

    SLING-8705 Manage factory service properties via SortableScriptEngineFactory
    
    * Add service properties to SortableScriptEngineFactory
    * Drop factoriesProperties
---
 .../impl/BindingsValuesProvidersByContextImpl.java |  6 ++---
 .../core/impl/jsr223/SlingScriptEngineManager.java | 26 +++++++++++-----------
 .../impl/jsr223/SortableScriptEngineFactory.java   | 16 ++++++++++++-
 .../impl/jsr223/SlingScriptEngineManagerTest.java  |  2 +-
 .../jsr223/SortableScriptEngineFactoryTest.java    | 26 +++++++++++-----------
 5 files changed, 45 insertions(+), 31 deletions(-)

diff --git a/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java b/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java
index 63f439c..850e5b1 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/BindingsValuesProvidersByContextImpl.java
@@ -151,9 +151,9 @@ public class BindingsValuesProvidersByContextImpl implements BindingsValuesProvi
 
         // we load the compatible language ones first so that the most specific
         // overrides these
-        Map<String, Object> factoryProps = scriptEngineManager.getProperties(scriptEngineFactory);
-        if (factoryProps != null) {
-            String[] compatibleLangs = PropertiesUtil.toStringArray(factoryProps.get("compatible.javax.script.name"), new String[0]);
+        final Map<String, Object> factoryProperties = scriptEngineManager.getServiceProperties(scriptEngineFactory);
+        if (factoryProperties != null) {
+            String[] compatibleLangs = PropertiesUtil.toStringArray(factoryProperties.get("compatible.javax.script.name"), new String[0]);
             for (final String name : compatibleLangs) {
                 final Map<ServiceReference, BindingsValuesProvider> langProviders = bvpc.getLangBindingsValuesProviders().get(name);
                 if (langProviders != null) {
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
index 7b56451..b414ac5 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
@@ -72,13 +72,13 @@ import org.slf4j.LoggerFactory;
 )
 public class SlingScriptEngineManager extends ScriptEngineManager implements BundleListener {
 
+    private ScriptEngineManager internalManager;
+
     private final Set<Bundle> engineSpiBundles = new HashSet<>();
-    private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
-    private final Map<ScriptEngineFactory, Map<String, Object>> factoriesProperties = new HashMap<>();
+
     private final Set<ServiceReference<ScriptEngineFactory>> serviceReferences = new HashSet<>();
 
-    private ScriptEngineManager internalManager;
-    private SortedSet<SortableScriptEngineFactory> factories = new TreeSet<>();
+    private final SortedSet<SortableScriptEngineFactory> factories = new TreeSet<>();
 
     private BundleContext bundleContext;
 
@@ -93,6 +93,8 @@ public class SlingScriptEngineManager extends ScriptEngineManager implements Bun
 
     static final String ENGINE_FACTORY_SERVICE = "META-INF/services/" + ScriptEngineFactory.class.getName();
 
+    private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+
     private final Logger logger = LoggerFactory.getLogger(SlingScriptEngineManager.class);
 
     @Override
@@ -187,10 +189,10 @@ public class SlingScriptEngineManager extends ScriptEngineManager implements Bun
         }
     }
 
-    public Map<String, Object> getProperties(ScriptEngineFactory factory) {
+    public Map<String, Object> getServiceProperties(final ScriptEngineFactory factory) {
         readWriteLock.readLock().lock();
         try {
-            return factoriesProperties.get(factory);
+            return factories.stream().filter(f -> f.getDelegate().equals(factory)).findFirst().map(SortableScriptEngineFactory::getServiceProperties).orElse(null);
         } finally {
             readWriteLock.readLock().unlock();
         }
@@ -231,11 +233,11 @@ public class SlingScriptEngineManager extends ScriptEngineManager implements Bun
         readWriteLock.writeLock().lock();
         try {
             internalManager = getInternalScriptEngineManager();
-            factories = new TreeSet<>();
+            factories.clear();
             long fakeBundleIdCounter = Long.MIN_VALUE;
             // first add the platform factories
             for (final ScriptEngineFactory factory : internalManager.getEngineFactories()) {
-                final SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(factory, fakeBundleIdCounter++, 0);
+                final SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(factory, fakeBundleIdCounter++, 0, null);
                 factories.add(sortableScriptEngineFactory);
             }
             // then factories from SPI Bundles
@@ -246,7 +248,7 @@ public class SlingScriptEngineManager extends ScriptEngineManager implements Bun
                     try {
                         final ScriptEngineManager manager = new ScriptEngineManager(bundle.adapt(BundleWiring.class).getClassLoader());
                         for (final ScriptEngineFactory factory : manager.getEngineFactories()) {
-                            final SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(factory, bundle.getBundleId(), 0);
+                            final SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(factory, bundle.getBundleId(), 0, null);
                             factories.add(sortableScriptEngineFactory);
                         }
                     } catch (Exception ex) {
@@ -259,16 +261,14 @@ public class SlingScriptEngineManager extends ScriptEngineManager implements Bun
             }
             // and finally factories registered as OSGi services
             if (bundleContext != null) {
-                factoriesProperties.clear();
                 for (final ServiceReference<ScriptEngineFactory> serviceReference : serviceReferences) {
                     final ScriptEngineFactory scriptEngineFactory = bundleContext.getService(serviceReference);
-                    final SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, serviceReference.getBundle().getBundleId(), PropertiesUtil.toInteger(serviceReference.getProperty(Constants.SERVICE_RANKING), 0));
-                    factories.add(sortableScriptEngineFactory);
                     final Map<String, Object> factoryProperties = new HashMap<>(serviceReference.getPropertyKeys().length);
                     for (final String key : serviceReference.getPropertyKeys()) {
                         factoryProperties.put(key, serviceReference.getProperty(key));
                     }
-                    factoriesProperties.put(scriptEngineFactory, factoryProperties);
+                    final SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, serviceReference.getBundle().getBundleId(), PropertiesUtil.toInteger(serviceReference.getProperty(Constants.SERVICE_RANKING), 0), factoryProperties);
+                    factories.add(sortableScriptEngineFactory);
                 }
             }
             // register the associations at the end, so that the priority sorting is taken into consideration
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactory.java b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactory.java
index e62b601..30a70bc 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactory.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactory.java
@@ -19,17 +19,20 @@
 package org.apache.sling.scripting.core.impl.jsr223;
 
 import java.util.List;
+import java.util.Map;
 
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineFactory;
 
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class SortableScriptEngineFactory implements ScriptEngineFactory, Comparable {
 
     private final ScriptEngineFactory delegate;
     private final int serviceRanking;
     private final long bundleId;
+    private final Map<String, Object> properties;
 
     /**
      * Constructor for implicit {@link ScriptEngineFactory} provided by the platform.
@@ -40,6 +43,7 @@ public class SortableScriptEngineFactory implements ScriptEngineFactory, Compara
         this.delegate = delegate;
         serviceRanking = 0;
         bundleId = 0;
+        properties = null;
     }
 
     /**
@@ -49,10 +53,11 @@ public class SortableScriptEngineFactory implements ScriptEngineFactory, Compara
      * @param bundleId       the bundle id of the bundle registering the {@link ScriptEngineFactory}
      * @param serviceRanking the service ranking of the {@link ScriptEngineFactory}
      */
-    SortableScriptEngineFactory(@NotNull ScriptEngineFactory delegate, long bundleId, int serviceRanking) {
+    SortableScriptEngineFactory(@NotNull ScriptEngineFactory delegate, long bundleId, int serviceRanking, @Nullable Map<String, Object> properties) {
         this.delegate = delegate;
         this.bundleId = bundleId;
         this.serviceRanking = serviceRanking;
+        this.properties = properties;
     }
 
     @Override
@@ -115,6 +120,14 @@ public class SortableScriptEngineFactory implements ScriptEngineFactory, Compara
         return delegate.getScriptEngine();
     }
 
+    @NotNull ScriptEngineFactory getDelegate() {
+        return delegate;
+    }
+
+    @Nullable Map<String, Object> getServiceProperties() {
+        return properties;
+    }
+
     @Override
     public int compareTo(@NotNull Object o) {
         SortableScriptEngineFactory other = (SortableScriptEngineFactory) o;
@@ -150,4 +163,5 @@ public class SortableScriptEngineFactory implements ScriptEngineFactory, Compara
         }
         return false;
     }
+
 }
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
index 4f28324..3289267 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
@@ -115,7 +115,7 @@ public class SlingScriptEngineManagerTest {
         assertEquals(f2.getEngineName(), factories.get(expectedScriptEngineFactories - 2).getEngineName());
 
         SlingScriptEngineManager slingScriptEngineManager = context.getService(SlingScriptEngineManager.class);
-        assertEquals(2, slingScriptEngineManager.getProperties(f1).get(Constants.SERVICE_RANKING));
+        assertEquals(2, slingScriptEngineManager.getServiceProperties(f1).get(Constants.SERVICE_RANKING));
 
         f1SR.unregister();
         expectedScriptEngineFactories--;
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactoryTest.java b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactoryTest.java
index 52b73ff..1bb8efd 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactoryTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SortableScriptEngineFactoryTest.java
@@ -44,7 +44,7 @@ public class SortableScriptEngineFactoryTest {
         String answer = "answer";
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getEngineName()).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getEngineName());
     }
 
@@ -53,7 +53,7 @@ public class SortableScriptEngineFactoryTest {
         String answer = "answer";
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getEngineVersion()).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getEngineVersion());
     }
 
@@ -62,7 +62,7 @@ public class SortableScriptEngineFactoryTest {
         List<String> answer = Collections.emptyList();
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getExtensions()).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getExtensions());
     }
 
@@ -71,7 +71,7 @@ public class SortableScriptEngineFactoryTest {
         List<String> answer = Collections.emptyList();
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getMimeTypes()).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getMimeTypes());
     }
 
@@ -80,7 +80,7 @@ public class SortableScriptEngineFactoryTest {
         List<String> answer = Collections.emptyList();
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getNames()).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getNames());
     }
 
@@ -89,7 +89,7 @@ public class SortableScriptEngineFactoryTest {
         String answer = "answer";
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getLanguageName()).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getLanguageName());
     }
 
@@ -98,7 +98,7 @@ public class SortableScriptEngineFactoryTest {
         String answer = "answer";
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getLanguageVersion()).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getLanguageVersion());
     }
 
@@ -108,7 +108,7 @@ public class SortableScriptEngineFactoryTest {
         String key = "key";
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getParameter(key)).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getParameter(key));
     }
 
@@ -120,7 +120,7 @@ public class SortableScriptEngineFactoryTest {
         String[] args = new String[0];
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getMethodCallSyntax(obj, m, args)).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getMethodCallSyntax(obj, m, args));
     }
 
@@ -130,7 +130,7 @@ public class SortableScriptEngineFactoryTest {
         String toDisplay = "toDisplay";
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getOutputStatement(toDisplay)).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getOutputStatement(toDisplay));
     }
 
@@ -140,7 +140,7 @@ public class SortableScriptEngineFactoryTest {
         String[] statements = new String[0];
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getProgram(statements)).thenReturn(answer);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(answer, sortableScriptEngineFactory.getProgram(statements));
     }
 
@@ -149,7 +149,7 @@ public class SortableScriptEngineFactoryTest {
         ScriptEngine scriptEngine = mock(ScriptEngine.class);
         ScriptEngineFactory scriptEngineFactory = mock(ScriptEngineFactory.class);
         when(scriptEngineFactory.getScriptEngine()).thenReturn(scriptEngine);
-        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0);
+        SortableScriptEngineFactory sortableScriptEngineFactory = new SortableScriptEngineFactory(scriptEngineFactory, 0, 0, null);
         assertEquals(scriptEngine, sortableScriptEngineFactory.getScriptEngine());
     }
 
@@ -169,6 +169,6 @@ public class SortableScriptEngineFactoryTest {
     }
 
     private SortableScriptEngineFactory getCompareFactory(long bundleId, int serviceRanking) {
-        return new SortableScriptEngineFactory(mock(ScriptEngineFactory.class), bundleId, serviceRanking);
+        return new SortableScriptEngineFactory(mock(ScriptEngineFactory.class), bundleId, serviceRanking, null);
     }
 }