FELIX-4965 throw ComponentException for invalid annotation member types
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1691762 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/Annotations.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/Annotations.java
index 78f7156..7ea1391 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/Annotations.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/Annotations.java
@@ -31,6 +31,7 @@
import java.util.regex.Pattern;
import org.osgi.framework.Bundle;
+import org.osgi.service.component.ComponentException;
public class Annotations
{
@@ -70,37 +71,42 @@
m.put( name, cooked );
}
if (!complexFields.isEmpty())
- {
- if (!supportsInterfaces )
+ {
+ if (supportsInterfaces )
{
- //error
- return null;//??
- }
- Map<String, List<Map<String, Object>>> nested = extractSubMaps(complexFields.keySet(), props);
- for (Map.Entry<String, Method> entry: complexFields.entrySet())
- {
- List<Map<String, Object>> proplist = nested.get(entry.getKey());
- Method method = entry.getValue();
- Class<?> returnType = method.getReturnType();
- if (returnType.isArray())
+ Map<String, List<Map<String, Object>>> nested = extractSubMaps(complexFields.keySet(), props);
+ for (Map.Entry<String, Method> entry: complexFields.entrySet())
{
- Class<?> componentType = returnType.getComponentType();
- Object result = Array.newInstance(componentType, proplist.size());
- for (int i = 0; i < proplist.size(); i++)
+ List<Map<String, Object>> proplist = nested.get(entry.getKey());
+ Method method = entry.getValue();
+ Class<?> returnType = method.getReturnType();
+ if (returnType.isArray())
{
- Map<String, Object> rawElement = proplist.get(i);
- Object cooked = toObject(componentType, rawElement, b, supportsInterfaces);
- Array.set(result, i, cooked);
+ Class<?> componentType = returnType.getComponentType();
+ Object result = Array.newInstance(componentType, proplist.size());
+ for (int i = 0; i < proplist.size(); i++)
+ {
+ Map<String, Object> rawElement = proplist.get(i);
+ Object cooked = toObject(componentType, rawElement, b, supportsInterfaces);
+ Array.set(result, i, cooked);
+ }
+ m.put(method.getName(), result);
}
- m.put(method.getName(), result);
+ else
+ {
+ if (!proplist.isEmpty())
+ {
+ Object cooked = toObject(returnType, proplist.get(0), b, supportsInterfaces);
+ m.put(method.getName(), cooked);
+ }
+ }
}
- else
+ }
+ else
+ {
+ for (Method method: complexFields.values())
{
- if (!proplist.isEmpty())
- {
- Object cooked = toObject(returnType, proplist.get(0), b, supportsInterfaces);
- m.put(method.getName(), cooked);
- }
+ m.put(method.getName(), Handler.INVALID);
}
}
}
@@ -209,7 +215,7 @@
private static class Handler implements InvocationHandler
{
-
+ private final static Object INVALID = new Object();
private final Map<String, Object> values;
public Handler(Map<String, Object> values)
@@ -219,7 +225,13 @@
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
- return values.get(method.getName());
+ Object value = values.get(method.getName());
+ if (INVALID == value)
+ {
+ throw new ComponentException(
+ "Invalid annotation member type" + method.getReturnType().getName() + " for member: " + method.getName());
+ }
+ return value;
}
}