SLING-6751 Migrate to OSGi R6 annotations
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1791083 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index 45598ff..31accda 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,16 +69,8 @@
</_removeheaders>
<ScriptEngine-Name>${project.name}</ScriptEngine-Name>
<ScriptEngine-Version>${project.version}</ScriptEngine-Version>
- <_plugin>org.apache.felix.scrplugin.bnd.SCRDescriptorBndPlugin;destdir=${project.build.outputDirectory};</_plugin>
</instructions>
</configuration>
- <dependencies>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.scr.bnd</artifactId>
- <version>1.7.2</version>
- </dependency>
- </dependencies>
</plugin>
</plugins>
</build>
@@ -150,11 +142,6 @@
<scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.scr.annotations</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
<version>1.7.7.1</version>
diff --git a/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java b/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java
index 2aac1e5..acd7bd1 100644
--- a/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java
+++ b/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java
@@ -24,17 +24,7 @@
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
import org.apache.sling.scripting.api.ScriptCache;
import org.apache.sling.scripting.javascript.RhinoHostObjectProvider;
@@ -59,64 +49,47 @@
import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.tools.debugger.ScopeProvider;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
import org.osgi.service.component.ComponentContext;
+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.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-/**
- * The <code>RhinoJavaScriptEngineFactory</code> TODO
- */
@Component(
- metatype = true,
- label = "Apache Sling Rhino Javascript Engine Factory",
- description = "Javascript engine based on Rhino"
-)
-@Service(ScriptEngineFactory.class)
-@Reference(
+ service = ScriptEngineFactory.class,
+ property = {
+ Constants.SERVICE_DESCRIPTION + "=Apache Sling Rhino Javascript Engine Factory",
+ Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
+ "extensions=" + RhinoJavaScriptEngineFactory.ECMA_SCRIPT_EXTENSION,
+ "extensions=" + RhinoJavaScriptEngineFactory.ESP_SCRIPT_EXTENSION,
+ "mimeTypes=text/javascript",
+ "mimeTypes=application/ecmascript",
+ "mimeTypes=application/javascript",
+ "names=javascript",
+ "names=JavaScript",
+ "names=ecmascript",
+ "names=ECMAScript"
+ },
+ reference = @Reference(
name = "HostObjectProvider",
- referenceInterface = RhinoHostObjectProvider.class,
- cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+ service = RhinoHostObjectProvider.class,
+ cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC,
bind = "addHostObjectProvider",
unbind = "removeHostObjectProvider"
-)
-@Properties({
- @Property(
- name = RhinoJavaScriptEngineFactory.OPTIMIZATION_CONFIG,
- label = "Rhino optimization level",
- intValue = RhinoJavaScriptEngineFactory.DEFAULT_OPTIMIZATION_LEVEL,
- description = "The level of optimization for the bytecode generated by Rhino. Provide values between 0-9, 9 being the most " +
- "aggressive level of optimization. A value of -1 will run scripts in interpreted mode."
- ),
- @Property(
- name = "extensions",
- value = {
- RhinoJavaScriptEngineFactory.ECMA_SCRIPT_EXTENSION,
- RhinoJavaScriptEngineFactory.ESP_SCRIPT_EXTENSION
- }
- ),
- @Property(
- name = "mimeTypes",
- value = {
- "text/javascript",
- "application/ecmascript",
- "application/javascript"
- }
- ),
- @Property(
- name = "names",
- value = {
- "javascript",
- "JavaScript",
- "ecmascript",
- "ECMAScript"
- }
)
-})
+)
+@Designate(
+ ocd = RhinoJavaScriptEngineFactoryConfiguration.class
+)
public class RhinoJavaScriptEngineFactory extends AbstractScriptEngineFactory implements ScopeProvider {
- public final static String OPTIMIZATION_CONFIG = "org.apache.sling.scripting.javascript.rhino.optLevel";
-
public final static int DEFAULT_OPTIMIZATION_LEVEL = 9;
public final static String ECMA_SCRIPT_EXTENSION = "ecma";
@@ -238,11 +211,11 @@
// ---------- SCR integration
@Activate
- protected void activate(ComponentContext context) {
+ protected void activate(final ComponentContext context, final RhinoJavaScriptEngineFactoryConfiguration configuration) {
Dictionary<?, ?> props = context.getProperties();
boolean debugging = getProperty("org.apache.sling.scripting.javascript.debug", props, context.getBundleContext(), false);
- optimizationLevel = readOptimizationLevel(props);
+ optimizationLevel = readOptimizationLevel(configuration);
// setup the wrap factory
wrapFactory = new SlingWrapFactory();
@@ -369,8 +342,8 @@
: defaultValue;
}
- private int readOptimizationLevel(Dictionary<?, ?> dictionary) {
- int optLevel = PropertiesUtil.toInteger(dictionary.get(OPTIMIZATION_CONFIG), DEFAULT_OPTIMIZATION_LEVEL);
+ private int readOptimizationLevel(final RhinoJavaScriptEngineFactoryConfiguration configuration) {
+ int optLevel = configuration.org_apache_sling_scripting_javascript_rhino_optLevel();
if (!Context.isValidOptimizationLevel(optLevel)) {
log.warn("Invalid optimization level {}, using default value", optLevel);
optLevel = DEFAULT_OPTIMIZATION_LEVEL;
diff --git a/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactoryConfiguration.java b/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactoryConfiguration.java
new file mode 100644
index 0000000..dc41745
--- /dev/null
+++ b/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactoryConfiguration.java
@@ -0,0 +1,36 @@
+/*
+ * 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.javascript.internal;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+@ObjectClassDefinition(
+ name = "Apache Sling Rhino JavaScript Engine Factory",
+ description = "JavaScript engine based on Rhino"
+)
+@interface RhinoJavaScriptEngineFactoryConfiguration {
+
+ @AttributeDefinition(
+ name = "Rhino optimization level",
+ description = "The level of optimization for the bytecode generated by Rhino. Provide values between 0-9, 9 being the most aggressive level of optimization. A value of -1 will run scripts in interpreted mode."
+ )
+ int org_apache_sling_scripting_javascript_rhino_optLevel() default RhinoJavaScriptEngineFactory.DEFAULT_OPTIMIZATION_LEVEL;
+
+}
diff --git a/src/test/java/org/apache/sling/scripting/javascript/internal/ScriptEngineHelper.java b/src/test/java/org/apache/sling/scripting/javascript/internal/ScriptEngineHelper.java
index 135112d..5a434a8 100644
--- a/src/test/java/org/apache/sling/scripting/javascript/internal/ScriptEngineHelper.java
+++ b/src/test/java/org/apache/sling/scripting/javascript/internal/ScriptEngineHelper.java
@@ -33,18 +33,18 @@
import org.apache.sling.commons.testing.osgi.MockBundle;
import org.apache.sling.commons.testing.osgi.MockComponentContext;
import org.apache.sling.scripting.api.ScriptCache;
-import org.mockito.Mockito;
import org.mockito.internal.util.reflection.Whitebox;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.Wrapper;
import org.osgi.framework.BundleContext;
+import static org.mockito.Mockito.mock;
/** Helpers to run javascript code fragments in tests */
public class ScriptEngineHelper {
private static ScriptEngine engine;
- private static ScriptCache scriptCache = Mockito.mock(ScriptCache.class);
+ private static ScriptCache scriptCache = mock(ScriptCache.class);
public static class Data extends HashMap<String, Object> {
}
@@ -52,10 +52,12 @@
private static ScriptEngine getEngine() {
if (engine == null) {
synchronized (ScriptEngineHelper.class) {
- RhinoJavaScriptEngineFactory f = new RhinoJavaScriptEngineFactory();
- Whitebox.setInternalState(f, "scriptCache", scriptCache);
- f.activate(new RhinoMockComponentContext());
- engine = f.getScriptEngine();
+ final RhinoMockComponentContext componentContext = new RhinoMockComponentContext();
+ final RhinoJavaScriptEngineFactoryConfiguration configuration = mock(RhinoJavaScriptEngineFactoryConfiguration.class);
+ RhinoJavaScriptEngineFactory factory = new RhinoJavaScriptEngineFactory();
+ Whitebox.setInternalState(factory, "scriptCache", scriptCache);
+ factory.activate(componentContext, configuration);
+ engine = factory.getScriptEngine();
}
}
return engine;
@@ -113,7 +115,7 @@
private static class RhinoMockComponentContext extends MockComponentContext {
- private BundleContext bundleContext = Mockito.mock(BundleContext.class);
+ private BundleContext bundleContext = mock(BundleContext.class);
private RhinoMockComponentContext() {
super(new MockBundle(0));