package net.codjo.dataprocess.common.eventsbinder.reflect; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; /** * */ public class GetterHelper { private GetterHelper() { } public static Object safeGetProperty(String propertyName, Object object) { try { return getProperty(propertyName, object); } catch (GetterHelperException e) { return null; } } public static Object getProperty(String propertyName, Object object) throws GetterHelperException { if (!propertyName.contains(".")) { return getDirectProperty(propertyName, object); } List<String> parts = new ArrayList<String>(); StringTokenizer stringTokenizer = new StringTokenizer(propertyName, "."); while (stringTokenizer.hasMoreElements()) { parts.add(stringTokenizer.nextElement().toString()); } StringBuilder currentDone = new StringBuilder(); Object currentObject = object; for (String property : parts) { try { currentObject = getDirectProperty(property, currentObject); } catch (GetterHelperException ghex) { if (!(ghex.getCause() instanceof NoSuchMethodException)) { throw ghex; } else { String msg = "Invalid property '" + currentDone + "[" + propertyName.substring(currentDone.length()) + "]'"; throw new GetterHelperException(msg, ghex.getCause()); } } if (currentDone.length() > 0) { currentDone.append("."); } currentDone.append(property); } return currentObject; } private static Object getDirectProperty(String propertyName, Object object) throws GetterHelperException { try { // try a get String getPropertyName = "get" + propertyName.substring(0, 1).toUpperCase() + propertyName .substring(1); return object.getClass().getMethod(getPropertyName).invoke(object); } catch (Exception e) { // try simple name try { return object.getClass().getMethod(propertyName).invoke(object); } catch (Exception e2) { throw new GetterHelperException(e2); } } } }