| package org.testng.xml.dom; |
| |
| import org.testng.collections.Lists; |
| import org.testng.internal.collections.Pair; |
| |
| import java.lang.annotation.Annotation; |
| import java.lang.reflect.Method; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| public class Reflect { |
| public static List<Pair<Method, Wrapper>> findMethodsWithAnnotation( |
| Class<?> c, Class<? extends Annotation> ac, Object bean) { |
| List<Pair<Method, Wrapper>> result = Lists.newArrayList(); |
| for (Method m : c.getMethods()) { |
| Annotation a = m.getAnnotation(ac); |
| if (a != null) { |
| result.add(Pair.of(m, new Wrapper(a, bean))); |
| } |
| } |
| return result; |
| } |
| |
| public static Pair<Method, Wrapper> findSetterForTag( |
| Class<?> c, String tagName, Object bean) { |
| |
| // Try to find an annotation |
| List<Class<? extends Annotation>> annotations = |
| Arrays.asList(OnElement.class, OnElementList.class, Tag.class); |
| for (Class<? extends Annotation> annotationClass : annotations) { |
| List<Pair<Method, Wrapper>> methods |
| = findMethodsWithAnnotation(c, annotationClass, bean); |
| |
| for (Pair<Method, Wrapper> pair : methods) { |
| if (pair.second().getTagName().equals(tagName)) { |
| return pair; |
| } |
| } |
| } |
| |
| // try fo find an adder or a setter |
| for (String prefix : new String[] { "add", "set" }) { |
| for (Method m : c.getDeclaredMethods()) { |
| String methodName = toCamelCase(tagName, prefix); |
| if (m.getName().equals(methodName)) { |
| return Pair.of(m, null); |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| private static String toCamelCase(String name, String prefix) { |
| return prefix + toCapitalizedCamelCase(name); |
| } |
| |
| public static String toCapitalizedCamelCase(String name) { |
| StringBuilder result = new StringBuilder(name.substring(0, 1).toUpperCase()); |
| for (int i = 1; i < name.length(); i++) { |
| if (name.charAt(i) == '-') { |
| result.append(Character.toUpperCase(name.charAt(i + 1))); |
| i++; |
| } else { |
| result.append(name.charAt(i)); |
| } |
| } |
| return result.toString(); |
| } |
| |
| } |