public static AnnotationDefinition buildAnnotationDefinition(Class cls) { if (!cls.isAnnotation()) return null; AnnotationDefinitionImpl annotationDefinition = new AnnotationDefinitionImpl(NamingUtils.normalizeClassName(cls.getName())); // set retention and target. DriverUtils.copyAnnotationRetention(cls, annotationDefinition); DriverUtils.copyAnnotationTarget(cls, annotationDefinition); Method[] methods = cls.getMethods(); Method method; AnnotationValuePairDefinitionImpl valuePairDefinition; Class returnType; boolean isArray = false; for (int i = 0; methods != null && i < methods.length; i++) { method = methods[i]; if (DriverUtils.isAnnotationMember(cls, method)) { returnType = method.getReturnType(); if ((isArray = returnType.isArray())) returnType = returnType.getComponentType(); valuePairDefinition = new AnnotationValuePairDefinitionImpl( method.getName(), NamingUtils.normalizeClassName(returnType.getName()), DriverUtils.buildValuePairType(returnType), isArray, // TODO, review this default value assignment, when we have annotations the default // value should be an AnnotationInstance method.getDefaultValue() != null ? method.getDefaultValue().toString() : null); if (valuePairDefinition.isAnnotation()) { valuePairDefinition.setAnnotationDefinition(buildAnnotationDefinition(returnType)); } if (valuePairDefinition.isEnum()) { Object[] enumConstants = returnType.getEnumConstants(); if (enumConstants != null) { String[] strEnumConstants = new String[enumConstants.length]; for (int j = 0; j < enumConstants.length; j++) { strEnumConstants[j] = enumConstants[j].toString(); } valuePairDefinition.setEnumValues(strEnumConstants); } } annotationDefinition.addValuePair(valuePairDefinition); } } return annotationDefinition; }
public static String encodeEnumValue( AnnotationValuePairDefinition valuePairDefinition, Object value) { if (value == null) return null; StringBuilder encodedValue = new StringBuilder(); encodedValue.append(NamingUtils.normalizeClassName(valuePairDefinition.getClassName())); encodedValue.append("."); encodedValue.append(value.toString()); return encodedValue.toString(); }
public static String encodePrimitiveValue( AnnotationValuePairDefinition valuePairDefinition, Object value) { if (value == null) return null; StringBuilder encodedValue = new StringBuilder(); if (NamingUtils.isCharId(valuePairDefinition.getClassName()) || Character.class.getName().equals(valuePairDefinition.getClassName())) { String strValue = value.toString(); if (StringEscapeUtils.isSingleQuoted(strValue)) { encodedValue.append(strValue); } else { encodedValue.append("'"); encodedValue.append(value.toString()); encodedValue.append("'"); } } else if (NamingUtils.isLongId(valuePairDefinition.getClassName()) || Long.class.getName().equals(valuePairDefinition.getClassName())) { encodedValue.append(value.toString()); encodedValue.append("L"); } else if (NamingUtils.isFloatId(valuePairDefinition.getClassName()) || Float.class.getName().equals(valuePairDefinition.getClassName())) { encodedValue.append(value.toString()); encodedValue.append("f"); } else if (NamingUtils.isDoubleId(valuePairDefinition.getClassName()) || Double.class.getName().equals(valuePairDefinition.getClassName())) { encodedValue.append(value.toString()); encodedValue.append("d"); } else if (NamingUtils.isByteId(valuePairDefinition.getClassName()) || Byte.class.getName().equals(valuePairDefinition.getClassName())) { encodedValue.append("(byte)"); encodedValue.append(value.toString()); } else { encodedValue.append(value.toString()); } return encodedValue.toString(); }
public static AnnotationValuePairDefinition.ValuePairType buildValuePairType(Class cls) { if (cls.isEnum()) { return AnnotationValuePairDefinition.ValuePairType.ENUM; } else if (cls.isAnnotation()) { return AnnotationValuePairDefinition.ValuePairType.ANNOTATION; } else if (cls.getName().equals(String.class.getName())) { return AnnotationValuePairDefinition.ValuePairType.STRING; } else if (NamingUtils.isPrimitiveTypeId(cls.getName())) { return AnnotationValuePairDefinition.ValuePairType.PRIMITIVE; } else { return AnnotationValuePairDefinition.ValuePairType.CLASS; } }
public static boolean isValidAnnotationBaseReturnType(Class cls) { // TODO review this calculation return (cls.isAnnotation() || cls.isEnum() || NamingUtils.isPrimitiveTypeId(cls.getName())) || (!cls.isAnonymousClass() && !cls.isLocalClass()); }