public String resolveAnnotationType(Annotation annotation) {
    StringBuffer type = new StringBuffer();
    AnnotationDefinition annotationDefinition = annotation.getAnnotationDefinition();

    if (annotationDefinition == null) {
      logger.warn("Annotation definition for annotation: " + annotation + " is not defined.");
      return type.toString();
    }

    if (annotationDefinition.isMarker()) {
      return type.toString();
    }

    // finally we can process annotation members.
    Object memberValue;
    int memberCount = 0;
    for (AnnotationMemberDefinition memberDefinition :
        annotationDefinition.getAnnotationMembers()) {
      if ((memberValue = annotation.getValue(memberDefinition.getName())) != null) {
        // a value has been set for this member.
        if (memberCount == 0) type.append("(");
        if (memberCount > 0) type.append(", ");
        type.append(resolveMemberType(memberDefinition, memberValue));
        memberCount++;
      }
    }
    if (memberCount > 0) type.append(")");

    return type.toString();
  }
 public static AnnotationDefinition build(
     Class annotationClass, Map<String, String> valueMap, TypeResolver resolver)
     throws NoSuchMethodException {
   AnnotationDefinition annotationDefinition = new AnnotationDefinition(annotationClass.getName());
   HashMap<String, AnnotationPropertyVal> values = new HashMap<String, AnnotationPropertyVal>();
   for (String key : valueMap.keySet()) {
     AnnotationPropertyVal value = rebuild(key, annotationClass, valueMap.get(key), resolver);
     if (value != null) {
       values.put(key, value);
     }
   }
   annotationDefinition.values = Collections.unmodifiableMap(values);
   return annotationDefinition;
 }