Fix:
* FELIX-4251 The @Bind annotation should use Class instead of String
* FELIX-4269 Introduce an enumeration to configure binding policy from the annotation


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1528874 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Bind.java b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Bind.java
index e0e383e..51042e9 100644
--- a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Bind.java
+++ b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Bind.java
@@ -49,9 +49,9 @@
     

     /**

      * Set the required specification.

-     * Default : empty (try to discover)

+     * Default : no specification, will be deduced.

      */

-    String specification() default "";

+    Class specification() default Object.class;

     

     /**

      * Set the dependency id.

@@ -61,16 +61,16 @@
     

     /**

      * Set the binding policy.

-     * Acceptable policy are dynamic, static and dynamic-priority.

+     * Acceptable policies are dynamic, static and dynamic-priority.

      * Default: dynamic.

      */

-    String policy() default "dynamic";

+    BindingPolicy policy() default BindingPolicy.DYNAMIC;

     

     /**

      * Set the comparator.

      * The indicated class must implement {@link Comparator}

      */

-    Class comparator() default Comparator.class;

+    Class<? extends Comparator> comparator() default Comparator.class;

     

     /**

      * Set the from attribute.

diff --git a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/BindingPolicy.java b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/BindingPolicy.java
new file mode 100644
index 0000000..6b86701
--- /dev/null
+++ b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/BindingPolicy.java
@@ -0,0 +1,29 @@
+/*
+ * 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.felix.ipojo.annotations;
+
+/**
+* Binding policies supported by iPOJO.
+*/
+public enum BindingPolicy {
+    DYNAMIC,
+    STATIC,
+    DYNAMIC_PRIORITY;
+}
diff --git a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Modified.java b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Modified.java
index b5bb099..ea8bd5a 100644
--- a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Modified.java
+++ b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Modified.java
@@ -62,16 +62,16 @@
 

     /**

      * Set the binding policy.

-     * Acceptable policy are dynamic, static and dynamic-priority.

+     * Acceptable policies are dynamic, static and dynamic-priority.

      * Default: dynamic.

      */

-    String policy() default "dynamic";

+    BindingPolicy policy() default BindingPolicy.DYNAMIC;

 

     /**

      * Set the comparator.

      * The indicated class must implement {@link Comparator}

      */

-    Class comparator() default Comparator.class;

+    Class<? extends Comparator> comparator() default Comparator.class;

 

     /**

      * Set the from attribute.

diff --git a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Requires.java b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Requires.java
index e6dd227..254016d 100644
--- a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Requires.java
+++ b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Requires.java
@@ -75,13 +75,13 @@
      * Acceptable policy are dynamic, static and dynamic-priority.

      * Default: dynamic.

      */

-    String policy() default "dynamic";

+    BindingPolicy policy() default BindingPolicy.DYNAMIC;

 

     /**

      * Set the comparator.

      * The indicated class must implement {@link Comparator}

      */

-    Class comparator() default Comparator.class;

+    Class<?extends Comparator> comparator() default Comparator.class;

 

     /**

      * Set the from attribute.

@@ -92,7 +92,7 @@
      * Set the required service specification.

      * This attribute is required for Collection field.

      */

-    String specification() default "";

+    Class specification() default Object.class;

 

     /**

      * Set to true if the service dependency is injected

diff --git a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Unbind.java b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Unbind.java
index 56dfb6c..ae71620 100644
--- a/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Unbind.java
+++ b/ipojo/manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/Unbind.java
@@ -52,7 +52,7 @@
      * Set the required specification.

      * Default : empty (try to discover).

      */

-    String specification() default "";

+    Class specification() default Object.class;

     

     /**

      * Set the dependency id.

@@ -65,13 +65,13 @@
      * Acceptable policy are dynamic, static and dynamic-priority.

      * Default: dynamic.

      */

-    String policy() default "dynamic";

+    BindingPolicy policy() default BindingPolicy.DYNAMIC;

     

     /**

      * Set the comparator.

      * The indicated class must implement {@link Comparator}

      */

-    Class comparator() default Comparator.class;

+    Class<? extends Comparator> comparator() default Comparator.class;

     

     /**

      * Set the from attribute.

diff --git a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/RequiresVisitor.java b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/RequiresVisitor.java
index db55218..8154169 100644
--- a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/RequiresVisitor.java
+++ b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/RequiresVisitor.java
@@ -129,8 +129,9 @@
             m_nullable = value.toString();
             return;
         }
+        // Used by component using the pre 1.11 version of annotations.
         if (name.equals("policy")) {
-            m_policy = value.toString();
+            m_policy = getPolicy(value.toString());
             return;
         }
         if (name.equals("defaultimplementation")) {
@@ -144,7 +145,13 @@
             return;
         }
         if (name.equals("specification")) {
-            m_specification = value.toString();
+            // Detect whether it's an internal class name.
+            if (value.toString().startsWith("L")  && value.toString().endsWith(";")) {
+                Type type = Type.getType(value.toString());
+                m_specification = type.getClassName();
+            } else {
+                m_specification = value.toString();
+            }
             return;
         }
         if (name.equals("id")) {
@@ -168,6 +175,13 @@
         }
     }
 
+    @Override
+    public void visitEnum(String name, String desc, String value) {
+        if (name.equals("policy")) {
+            m_policy = getPolicy(value.toString());
+        }
+    }
+
     /**
      * End of the annotation.
      * Create a "requires" element
@@ -231,4 +245,23 @@
 
         workbench.getElements().put(requires, null);
     }
+
+    /**
+     * Gets the iPOJO binding policy name from the given value.
+     * @param policy  the read policy
+     * @return the policy name
+     */
+    public static String getPolicy(String policy) {
+        if (policy.equalsIgnoreCase("static")) {
+            return "static";
+        }
+        if (policy.equalsIgnoreCase("dynamic")) {
+            return "dynamic";
+        }
+        // The _ is used in the annotation.
+        if (policy.equalsIgnoreCase("dynamic_priority")) {
+            return "dynamic-priority";
+        }
+        return policy;
+    }
 }
\ No newline at end of file
diff --git a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/bind/AbstractBindVisitor.java b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/bind/AbstractBindVisitor.java
index 07595f2..584c829 100644
--- a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/bind/AbstractBindVisitor.java
+++ b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/bind/AbstractBindVisitor.java
@@ -20,6 +20,7 @@
 package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.bind;
 
 import org.apache.felix.ipojo.manipulator.metadata.annotation.ComponentWorkbench;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.RequiresVisitor;
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 import org.objectweb.asm.AnnotationVisitor;
@@ -98,11 +99,18 @@
             return;
         }
         if (name.equals("specification")) {
-            m_specification = value.toString();
+            // Detect whether it's an internal class name.
+            if (value.toString().startsWith("L")  && value.toString().endsWith(";")) {
+                Type type = Type.getType(value.toString());
+                m_specification = type.getClassName();
+            } else {
+                m_specification = value.toString();
+            }
             return;
         }
+        // Still used by component using the old version of the annotations.
         if (name.equals("policy")) {
-            m_policy = value.toString();
+            m_policy = RequiresVisitor.getPolicy(value.toString());
             return;
         }
         if (name.equals("id")) {
@@ -123,6 +131,13 @@
 
     }
 
+    @Override
+    public void visitEnum(String name, String desc, String value) {
+        if (name.equals("policy")) {
+            m_policy = RequiresVisitor.getPolicy(value.toString());
+        }
+    }
+
     public void visitEnd() {
     }
 
diff --git a/ipojo/runtime/core-it/ipojo-core-annotations-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/PolicyDependency.java b/ipojo/runtime/core-it/ipojo-core-annotations-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/PolicyDependency.java
index c44ca3c..318cb5f 100644
--- a/ipojo/runtime/core-it/ipojo-core-annotations-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/PolicyDependency.java
+++ b/ipojo/runtime/core-it/ipojo-core-annotations-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/PolicyDependency.java
@@ -19,41 +19,38 @@
 

 package org.apache.felix.ipojo.runtime.core.test.components;

 

-import org.apache.felix.ipojo.annotations.Bind;

-import org.apache.felix.ipojo.annotations.Component;

-import org.apache.felix.ipojo.annotations.Requires;

-import org.apache.felix.ipojo.annotations.Unbind;

+import org.apache.felix.ipojo.annotations.*;

 import org.apache.felix.ipojo.runtime.core.test.services.FooService;

 

 @Component

 public class PolicyDependency {

 

-    @Requires(policy="static")

+    @Requires(policy= BindingPolicy.STATIC)

     public FooService fs;

     

-    @Requires(policy="dynamic-priority")

+    @Requires(policy=BindingPolicy.DYNAMIC_PRIORITY)

     public FooService fs2;

     

-    @Unbind(policy="static")

+    @Unbind(policy=BindingPolicy.STATIC)

     public void unbindBar() {    }

     @Bind

     public void bindBar() {    }

     

     @Unbind

     public void unbindBaz() {    }

-    @Bind(policy="static")

+    @Bind(policy=BindingPolicy.STATIC)

     public void bindBaz() {    }

    

-    @Requires(id="inv")

+    @Requires(id="inv", specification = FooService.class)

     public FooService fs2inv;

-    @Bind(id="inv", policy="static")

+    @Bind(id="inv", policy=BindingPolicy.STATIC)

     public void bindFS2Inv() {   }

     @Unbind(id="inv")

     public void unbindFS2Inv() {   }

     

-    @Unbind(policy="static", id="unbindonly")

+    @Unbind(policy=BindingPolicy.STATIC, id="unbindonly")

     public void unbind() {    }

     

-    @Bind(policy="static", id="bindonly")

+    @Bind(policy=BindingPolicy.STATIC, id="bindonly")

     public void bind() {    }

 }

diff --git a/ipojo/runtime/core-it/ipojo-core-annotations-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/annotations/TestDependencyPolicy.java b/ipojo/runtime/core-it/ipojo-core-annotations-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/annotations/TestDependencyPolicy.java
index b9af5aa..e726a3f 100644
--- a/ipojo/runtime/core-it/ipojo-core-annotations-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/annotations/TestDependencyPolicy.java
+++ b/ipojo/runtime/core-it/ipojo-core-annotations-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/annotations/TestDependencyPolicy.java
@@ -87,14 +87,14 @@
 

 

     private Element getDependencyById(Element[] deps, String name) {

-        for (int i = 0; i < deps.length; i++) {

-            String na = deps[i].getAttribute("id");

-            String field = deps[i].getAttribute("field");

+        for (Element dep : deps) {

+            String na = dep.getAttribute("id");

+            String field = dep.getAttribute("field");

             if (na != null && na.equalsIgnoreCase(name)) {

-                return deps[i];

+                return dep;

             }

             if (field != null && field.equalsIgnoreCase(name)) {

-                return deps[i];

+                return dep;

             }

         }

         fail("Dependency  " + name + " not found");

diff --git a/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/FooConsumer.java b/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/FooConsumer.java
index 11ce322..b6af0e7 100644
--- a/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/FooConsumer.java
+++ b/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/FooConsumer.java
@@ -35,7 +35,7 @@
 @Provides
 public class FooConsumer implements CheckService {
 
-    @Requires(id= "foo", policy = "dynamic-priority", proxy = false)
+    @Requires(id= "foo", policy = BindingPolicy.DYNAMIC_PRIORITY, proxy = false)
     private FooService foo;
 
     private Map<String, Object> props;