in deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/ProxyConfigurationLifecycle.java [59:207]
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable
{
if (Object.class == method.getDeclaringClass())
{
try
{
return method.invoke(this, args);
}
catch (final InvocationTargetException ite)
{
throw ite.getCause();
}
}
Supplier<?> supplier = resolvers.get(method);
if (supplier == null)
{
final ConfigProperty annotation = method.getAnnotation(ConfigProperty.class);
if (annotation == null)
{
throw new UnsupportedOperationException(
method + " doesn't have @ConfigProperty and therefore is illegal");
}
// handle primitive bridge there (cdi doesnt support primitives but no reason our proxies don't)
final Class<? extends ConfigResolver.Converter> converter = annotation.converter();
final Type genericReturnType = method.getGenericReturnType();
Class<?> returnType = method.getReturnType();
final boolean list;
final boolean set;
if (converter == ConfigResolver.Converter.class &&
ParameterizedType.class.isInstance(genericReturnType))
{
ParameterizedType pt = ParameterizedType.class.cast(genericReturnType);
if (List.class == pt.getRawType() && pt.getActualTypeArguments().length == 1)
{
list = true;
set = false;
final Type arg = pt.getActualTypeArguments()[0];
if (Class.class.isInstance(arg))
{
returnType = Class.class.cast(arg);
}
}
else if (Set.class == pt.getRawType() && pt.getActualTypeArguments().length == 1)
{
list = false;
set = true;
final Type arg = pt.getActualTypeArguments()[0];
if (Class.class.isInstance(arg))
{
returnType = Class.class.cast(arg);
}
}
else
{
list = false;
set = false;
}
}
else
{
list = false;
set = false;
if (int.class == returnType)
{
returnType = Integer.class;
}
else if (long.class == returnType)
{
returnType = Long.class;
}
else if (boolean.class == returnType)
{
returnType = Boolean.class;
}
else if (short.class == returnType)
{
returnType = Short.class;
}
else if (byte.class == returnType)
{
returnType = Byte.class;
}
else if (float.class == returnType)
{
returnType = Float.class;
}
else if (double.class == returnType)
{
returnType = Double.class;
}
}
final String defaultValue = annotation.defaultValue();
ConfigResolver.TypedResolver<?> typedResolver = delegate.asResolver(
prefix + annotation.name(), list || set ? ConfigProperty.NULL : defaultValue,
returnType, converter, annotation.parameterizedBy(),
annotation.projectStageAware(), annotation.evaluateVariables());
if (cacheMs > 0)
{
typedResolver.cacheFor(MILLISECONDS, cacheMs);
}
if (list || set)
{
ConfigResolver.TypedResolver<? extends List<?>> listTypedResolver = typedResolver.asList();
final ConfigResolver.TypedResolver<? extends List<?>> resolver;
if (!ConfigProperty.NULL.equals(defaultValue))
{
resolver = listTypedResolver.withStringDefault(defaultValue);
}
else
{
resolver = listTypedResolver;
}
if (list)
{
supplier = new DefaultSupplier(resolver);
}
else
{
supplier = new Supplier<Set<?>>()
{
@Override
public Set<?> get()
{
return new HashSet(resolver.getValue());
}
};
}
}
else
{
supplier = new DefaultSupplier(typedResolver);
}
final Supplier<?> existing = resolvers.putIfAbsent(method, supplier);
if (existing != null)
{
supplier = existing;
}
}
return supplier.get();
}