1 package org.pojomatic.internal; 2 3 import java.lang.reflect.Method; 4 5 public class PropertyAccessor extends AbstractPropertyElement<Method> { 6 private final static String GET = "get", IS = "is"; 7 8 public PropertyAccessor(Method method, String name) { 9 super(method, name.length() == 0 ? getName(method) : name); 10 } 11 12 private static String getName(Method method) { 13 String methodName = method.getName(); 14 if (isPrefixedWith(methodName, GET)) { 15 return decapitalize(methodName.substring(GET.length())); 16 } 17 else if (isBoolean(method.getReturnType()) && isPrefixedWith(methodName, IS)) { 18 return decapitalize(methodName.substring(IS.length())); 19 } 20 else { 21 return methodName; 22 } 23 } 24 25 private static boolean isBoolean(Class<?> clazz) { 26 return Boolean.class.equals(clazz) || Boolean.TYPE.equals(clazz); 27 } 28 29 private static boolean isPrefixedWith(String name, String prefix) { 30 return name.length() > prefix.length() 31 && name.startsWith(prefix) 32 && Character.isUpperCase(name.charAt(prefix.length())); 33 } 34 35 @Override 36 public String getElementName() { 37 return element.getName(); 38 } 39 40 @Override 41 public String getType() { 42 return "method"; 43 } 44 45 @Override 46 public Class<?> getPropertyType() { 47 return element.getReturnType(); 48 } 49 50 private static String decapitalize(String name) { 51 if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && 52 Character.isUpperCase(name.charAt(0))){ 53 return name; 54 } 55 char chars[] = name.toCharArray(); 56 chars[0] = Character.toLowerCase(chars[0]); 57 return new String(chars); 58 } 59 }