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/12/21 00:17:54 UTC
[sling-org-apache-sling-scripting-core] branch master updated:
SLING-5720 ScriptEngineManagerFactory is not updating ScriptEngineFactory's
cached service properties on modification
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
The following commit(s) were added to refs/heads/master by this push:
new 8d6ca12 SLING-5720 ScriptEngineManagerFactory is not updating ScriptEngineFactory's cached service properties on modification
8d6ca12 is described below
commit 8d6ca12a847a8e0dec3af55ebb3af2dfda9b9fd2
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sat Dec 21 01:17:37 2019 +0100
SLING-5720 ScriptEngineManagerFactory is not updating ScriptEngineFactory's cached service properties on modification
---
pom.xml | 8 +-
.../core/impl/jsr223/SlingScriptEngineManager.java | 6 ++
.../core/impl/jsr223/ConfigurableScriptEngine.java | 39 ++++++++
.../jsr223/ConfigurableScriptEngineFactory.java | 110 +++++++++++++++++++++
...nfigurableScriptEngineFactoryConfiguration.java | 79 +++++++++++++++
.../sling/scripting/core/it/SLING_5720IT.java | 95 ++++++++++++++++++
.../core/it/ScriptingCoreTestSupport.java | 4 +-
7 files changed, 339 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 8b2081c..b68a01f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -155,7 +155,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.testing.paxexam</artifactId>
- <version>3.0.0</version>
+ <version>3.1.0</version>
<scope>test</scope>
</dependency>
<!-- OSGi -->
@@ -261,6 +261,12 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.awaitility</groupId>
+ <artifactId>awaitility</artifactId>
+ <version>4.0.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.hamcrest</artifactId>
<version>1.3_1</version>
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 59b6231..bcc3a87 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
@@ -66,6 +66,7 @@ import org.slf4j.LoggerFactory;
name = "ScriptEngineFactory",
bind = "bindScriptEngineFactory",
unbind = "unbindScriptEngineFactory",
+ updated = "updatedScriptEngineFactory",
service = ScriptEngineFactory.class,
cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC
@@ -266,6 +267,11 @@ public class SlingScriptEngineManager extends ScriptEngineManager implements Bun
postEvent(SlingScriptConstants.TOPIC_SCRIPT_ENGINE_FACTORY_REMOVED, factory);
}
+ private void updatedScriptEngineFactory(final ServiceReference<ScriptEngineFactory> serviceReference, final ScriptEngineFactory factory) {
+ updateFactories();
+ postEvent("javax/script/ScriptEngineFactory/CHANGED", factory); // TODO SlingScriptConstants.TOPIC_SCRIPT_ENGINE_FACTORY_CHANGED
+ }
+
private void updateFactories() {
readWriteLock.writeLock().lock();
try {
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngine.java b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngine.java
new file mode 100644
index 0000000..149fbfc
--- /dev/null
+++ b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngine.java
@@ -0,0 +1,39 @@
+/*
+ * 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.jsr223;
+
+import java.io.Reader;
+
+import javax.script.ScriptContext;
+import javax.script.ScriptException;
+
+import org.apache.sling.scripting.api.AbstractSlingScriptEngine;
+
+public class ConfigurableScriptEngine extends AbstractSlingScriptEngine {
+
+ public ConfigurableScriptEngine(final ConfigurableScriptEngineFactory scriptEngineFactory) {
+ super(scriptEngineFactory);
+ }
+
+ @Override
+ public Object eval(Reader reader, ScriptContext context) throws ScriptException {
+ return null;
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngineFactory.java b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngineFactory.java
new file mode 100644
index 0000000..ee9cd67
--- /dev/null
+++ b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngineFactory.java
@@ -0,0 +1,110 @@
+/*
+ * 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.jsr223;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+
+import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Modified;
+import org.osgi.service.metatype.annotations.Designate;
+
+@Component(
+ service = ScriptEngineFactory.class,
+ configurationPid = ConfigurableScriptEngineFactory.CONFIGURATION_PID,
+ property = {
+ Constants.SERVICE_DESCRIPTION + "=Apache Sling Scripting Configurable ScriptEngineFactory",
+ Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
+ }
+)
+@Designate(
+ ocd = ConfigurableScriptEngineFactoryConfiguration.class
+)
+public class ConfigurableScriptEngineFactory extends AbstractScriptEngineFactory {
+
+ private ConfigurableScriptEngineFactoryConfiguration configuration;
+
+ public static final String CONFIGURATION_PID = "foo";
+
+ public ConfigurableScriptEngineFactory() {
+ }
+
+ @Activate
+ private void activate(final ConfigurableScriptEngineFactoryConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
+ @Modified
+ private void modified(final ConfigurableScriptEngineFactoryConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
+ @Deactivate
+ private void deactivate() {
+ this.configuration = null;
+ }
+
+ @Override
+ public String getEngineName() {
+ return configuration.engineName();
+ }
+
+ @Override
+ public String getEngineVersion() {
+ return configuration.engineVersion();
+ }
+
+ @Override
+ public List<String> getExtensions() {
+ return Arrays.asList(configuration.extensions());
+ }
+
+ @Override
+ public List<String> getMimeTypes() {
+ return Arrays.asList(configuration.mimeTypes());
+ }
+
+ @Override
+ public List<String> getNames() {
+ return Arrays.asList(configuration.names());
+ }
+
+ @Override
+ public String getLanguageName() {
+ return configuration.languageName();
+ }
+
+ @Override
+ public String getLanguageVersion() {
+ return configuration.languageVersion();
+ }
+
+ @Override
+ public ScriptEngine getScriptEngine() {
+ return new ConfigurableScriptEngine(this);
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngineFactoryConfiguration.java b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngineFactoryConfiguration.java
new file mode 100644
index 0000000..352eee7
--- /dev/null
+++ b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/ConfigurableScriptEngineFactoryConfiguration.java
@@ -0,0 +1,79 @@
+/*
+ * 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.jsr223;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+@ObjectClassDefinition(
+ name = "Apache Sling Scripting Configurable ScriptEngineFactory",
+ description = "Configurable scripting engine for integration tests"
+)
+public @interface ConfigurableScriptEngineFactoryConfiguration {
+
+ @AttributeDefinition(
+ name = "engine name",
+ description = "engine name"
+ )
+ String engineName() default "foo";
+
+ @AttributeDefinition(
+ name = "engine version",
+ description = "engine version"
+ )
+ String engineVersion() default "1.0";
+
+ @AttributeDefinition(
+ name = "language name",
+ description = "language name"
+ )
+ String languageName() default "foo";
+
+ @AttributeDefinition(
+ name = "language version",
+ description = "language version"
+ )
+ String languageVersion() default "1.0";
+
+ @AttributeDefinition(
+ name = "extensions",
+ description = "extensions"
+ )
+ String[] extensions() default {
+ "foo"
+ };
+
+ @AttributeDefinition(
+ name = "mime types",
+ description = "mime types"
+ )
+ String[] mimeTypes() default {
+ "text/x-foo"
+ };
+
+ @AttributeDefinition(
+ name = "names",
+ description = "names"
+ )
+ String[] names() default {
+ "Foo",
+ "foo"
+ };
+
+}
diff --git a/src/test/java/org/apache/sling/scripting/core/it/SLING_5720IT.java b/src/test/java/org/apache/sling/scripting/core/it/SLING_5720IT.java
new file mode 100644
index 0000000..0914854
--- /dev/null
+++ b/src/test/java/org/apache/sling/scripting/core/it/SLING_5720IT.java
@@ -0,0 +1,95 @@
+/*
+ * 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.it;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Objects;
+
+import javax.inject.Inject;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+
+import org.apache.sling.scripting.core.impl.jsr223.ConfigurableScriptEngine;
+import org.apache.sling.scripting.core.impl.jsr223.ConfigurableScriptEngineFactory;
+import org.apache.sling.scripting.core.impl.jsr223.ConfigurableScriptEngineFactoryConfiguration;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.sling.scripting.core.impl.jsr223.ConfigurableScriptEngineFactory.CONFIGURATION_PID;
+import static org.awaitility.Awaitility.with;
+import static org.junit.Assert.assertNotNull;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
+
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerClass.class)
+public class SLING_5720IT extends ScriptingCoreTestSupport {
+
+ @Inject
+ private ConfigurationAdmin configurationAdmin;
+
+ @Inject
+ private ScriptEngineManager scriptEngineManager;
+
+ @Configuration
+ public Option[] configuration() {
+ return options(
+ baseConfiguration(),
+ newConfiguration(CONFIGURATION_PID)
+ .put("engineVersion", "2.0")
+ .asOption(),
+ buildBundleWithBnd(
+ ConfigurableScriptEngine.class,
+ ConfigurableScriptEngineFactory.class,
+ ConfigurableScriptEngineFactoryConfiguration.class
+ )
+ );
+ }
+
+ @Test
+ public void testConfigurableScriptEngineFactory() throws IOException {
+ final ScriptEngine fooScriptEngine = scriptEngineManager.getEngineByExtension("foo");
+ assertNotNull(fooScriptEngine);
+ final Dictionary<String, Object> properties = new Hashtable<>();
+ final String[] extensions = {"foo", "bar"};
+ properties.put("extensions", extensions);
+ configurationAdmin.getConfiguration(CONFIGURATION_PID, null).update(properties);
+ with().
+ pollInterval(1, SECONDS).
+ then().
+ await().
+ alias("getting script engine by extension").
+ atMost(10, SECONDS).
+ until(() -> Objects.nonNull(getScriptEngineByExtension("bar")));
+ }
+
+ private ScriptEngine getScriptEngineByExtension(final String extension) {
+ return scriptEngineManager.getEngineByExtension(extension);
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/scripting/core/it/ScriptingCoreTestSupport.java b/src/test/java/org/apache/sling/scripting/core/it/ScriptingCoreTestSupport.java
index 975d68c..dca83e4 100644
--- a/src/test/java/org/apache/sling/scripting/core/it/ScriptingCoreTestSupport.java
+++ b/src/test/java/org/apache/sling/scripting/core/it/ScriptingCoreTestSupport.java
@@ -28,6 +28,7 @@ import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.options.CompositeOption;
import org.ops4j.pax.exam.options.ModifiableCompositeOption;
+import static org.apache.sling.testing.paxexam.SlingOptions.awaitility;
import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
import static org.apache.sling.testing.paxexam.SlingOptions.slingScripting;
import static org.apache.sling.testing.paxexam.SlingOptions.versionResolver;
@@ -66,7 +67,8 @@ public class ScriptingCoreTestSupport extends TestSupport {
slingResourcePresence(),
mavenBundle().groupId("org.jsoup").artifactId("jsoup").versionAsInProject(),
mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.hamcrest").versionAsInProject(),
- junitBundles()
+ junitBundles(),
+ awaitility()
);
}