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);
}
}