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;