Beispiel #1
0
    @Override
    public <T extends Annotation> T getAnnotation(final Class<T> annotationClass) {
      org.jboss.forge.parser.java.Annotation<?> annotation = null;

      // https://issues.jboss.org/browse/FORGE-439: support annotations on readMethod

      if (this.readMethod != null) {
        annotation = this.readMethod.getAnnotation(annotationClass.getName());
      }

      if (annotation == null && this.privateField != null) {
        annotation = this.privateField.getAnnotation(annotationClass.getName());
      }

      if (annotation != null) {
        T annotationProxy = AnnotationProxy.newInstance(annotation);
        return annotationProxy;
      }

      return null;
    }
Beispiel #2
0
    /**
     * Parses the given literal value into the given returnType. Supports all standard annotation
     * types (JLS 9.7).
     */
    private Object parse(String literalValue, Class<?> returnType) throws ClassNotFoundException {
      // Primitives

      if (byte.class.equals(returnType)) {
        return Byte.valueOf(literalValue);
      }
      if (short.class.equals(returnType)) {
        return Short.valueOf(literalValue);
      }
      if (int.class.equals(returnType)) {
        return Integer.valueOf(literalValue);
      }
      if (long.class.equals(returnType)) {
        String valueToUse = literalValue;
        if (valueToUse.endsWith("l") || valueToUse.endsWith("L")) {
          valueToUse = valueToUse.substring(0, valueToUse.length() - 1);
        }
        return Long.valueOf(valueToUse);
      }
      if (float.class.equals(returnType)) {
        String valueToUse = literalValue;
        if (valueToUse.endsWith("f") || valueToUse.endsWith("F")) {
          valueToUse = valueToUse.substring(0, valueToUse.length() - 1);
        }
        return Float.valueOf(valueToUse);
      }
      if (double.class.equals(returnType)) {
        String valueToUse = literalValue;
        if (valueToUse.endsWith("d") || valueToUse.endsWith("D")) {
          valueToUse = literalValue.substring(0, valueToUse.length() - 1);
        }
        return Double.valueOf(valueToUse);
      }
      if (boolean.class.equals(returnType)) {
        return Boolean.valueOf(literalValue);
      }
      if (char.class.equals(returnType)) {
        return Character.valueOf(literalValue.charAt(1));
      }

      // Arrays

      if (returnType.isArray()) {
        String[] values = literalValue.substring(1, literalValue.length() - 1).split(",");
        int length = values.length;
        Class<?> componentType = returnType.getComponentType();
        Object array = Array.newInstance(componentType, length);

        for (int loop = 0; loop < length; loop++) {
          Array.set(array, loop, parse(values[loop], componentType));
        }

        return array;
      }

      // Enums

      if (returnType.isEnum()) {
        Enum<?>[] constants = (Enum<?>[]) returnType.getEnumConstants();

        String valueToUse = StringUtils.substringAfterLast(literalValue, '.');

        for (Enum<?> inst : constants) {
          if (inst.name().equals(valueToUse)) {
            return inst;
          }
        }

        return null;
      }

      // Strings

      if (String.class.equals(returnType)) {
        return literalValue.substring(1, literalValue.length() - 1);
      }

      // Classes

      if (Class.class.equals(returnType)) {
        String resolvedType = StringUtils.substringBefore(literalValue, ".class");
        resolvedType =
            ((JavaSource<?>) this.annotationSource.getOrigin()).resolveType(resolvedType);
        return Class.forName(resolvedType);
      }

      // Annotations

      if (Annotation.class.isAssignableFrom(returnType)) {
        String resolvedType = StringUtils.substringAfter(literalValue, "@");
        resolvedType =
            ((JavaSource<?>) this.annotationSource.getOrigin()).resolveType(resolvedType);

        return AnnotationProxy.newInstance(this.annotationSource);
      }

      // Unknown

      throw new UnsupportedOperationException(returnType.getSimpleName());
    }