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