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