private MethodMeta()

in impl/src/main/java/org/apache/geronimo/config/cdi/ConfigurationHandler.java [83:176]


        private MethodMeta(final Method m, final String prefix) {
            final ConfigProperty annotation = m.getAnnotation(ConfigProperty.class);
            optional = Optional.class == m.getReturnType();
            final Type type = optional ?
                    ParameterizedType.class.cast(m.getGenericReturnType()).getActualTypeArguments()[0] :
                    m.getGenericReturnType();

            if (Class.class.isInstance(type)) {
                lookupType = Class.class.cast(type);
                collectionCollector = null;
                collectionConversionType = null;
            } else if (ParameterizedType.class.isInstance(type)) {
                final ParameterizedType pt = ParameterizedType.class.cast(type);
                final Type rawType = pt.getRawType();
                if (!Class.class.isInstance(rawType)) {
                    throw new IllegalArgumentException("Unsupported parameterized type: " + type);
                }

                final Class<?> clazz = Class.class.cast(pt.getRawType());
                if (Collection.class.isAssignableFrom(clazz)) {
                    final Type arg0 = pt.getActualTypeArguments()[0];
                    collectionConversionType = Class.class.cast(ParameterizedType.class.isInstance(arg0) ?
                            // mainly to tolerate Class<?> as an arg
                            ParameterizedType.class.cast(arg0).getRawType() : Class.class.cast(arg0));
                    lookupType = String.class;
                    if (Set.class.isAssignableFrom(clazz)) {
                        collectionCollector = toSet();
                    } else {
                        collectionCollector = toList();
                    }
                } else {
                    throw new IllegalArgumentException("Unsupported parameterized type: " + type + ", did you want a Collection?");
                }
            } else {
                throw new IllegalArgumentException("Unsupported type: " + type);
            }

            key = prefix + (annotation.name().isEmpty() ? m.getDeclaringClass().getName() + "." + m.getName() : annotation.name());

            final String defaultValue = annotation.defaultValue();
            final boolean canBeNull = ConfigProperty.UNCONFIGURED_VALUE.equals(defaultValue);
            final boolean hasDefault = !ConfigProperty.UNCONFIGURED_VALUE.equals(defaultValue) && !canBeNull;

            if (hasDefault) {
                final Config config = ConfigProvider.getConfig();
                if (lookupType == long.class || lookupType == Long.class) {
                    this.defaultValue = Long.parseLong(defaultValue);
                } else if (lookupType == boolean.class || lookupType == Boolean.class) {
                    this.defaultValue = Boolean.parseBoolean(defaultValue);
                } else if (lookupType == int.class || lookupType == Integer.class) {
                    this.defaultValue = Integer.parseInt(defaultValue);
                } else if (lookupType == double.class || lookupType == Double.class) {
                    this.defaultValue = Double.parseDouble(defaultValue);
                } else if (lookupType == float.class || lookupType == Float.class) {
                    this.defaultValue = Float.parseFloat(defaultValue);
                } else if (lookupType == short.class || lookupType == Short.class) {
                    this.defaultValue = Short.parseShort(defaultValue);
                } else if (lookupType == char.class || lookupType == Character.class) {
                    this.defaultValue = defaultValue.charAt(0);
                } else if (lookupType == byte.class || lookupType == Byte.class) {
                    this.defaultValue = Byte.parseByte(defaultValue);
                } else if (collectionCollector != null) {
                    this.defaultValue = convert(defaultValue, config);
                } else if (lookupType == String.class) {
                    this.defaultValue = defaultValue;
                } else {
                    throw new IllegalArgumentException("Unsupported default for " + m);
                }
            } else {
                if (lookupType.isPrimitive()) {
                    if (lookupType == long.class) {
                        this.defaultValue = 0L;
                    } else if (lookupType == boolean.class) {
                        this.defaultValue = false;
                    } else if (lookupType == int.class ) {
                        this.defaultValue = 0;
                    } else if (lookupType == double.class) {
                        this.defaultValue = 0.0D;
                    } else if (lookupType == float.class) {
                        this.defaultValue = 0.0F;
                    } else if (lookupType == short.class) {
                        this.defaultValue = (short) 0;
                    } else if (lookupType == char.class) {
                        this.defaultValue = '\u0000';
                    } else if (lookupType == byte.class) {
                        this.defaultValue = (byte) 0;
                    } else {
                        this.defaultValue = null;
                    }
                } else {
                    this.defaultValue = null;
                }
            }
        }