/*******************************************************************************
* Copyright (c) 2010, 2015 Tom Schindl and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
*******************************************************************************/
package org.eclipse.e4.ui.css.swt.helpers;
import java.util.HashMap;
import java.lang.reflect.Method;
import java.util.Map;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class PropertyHelper {
private static final Map<String, Method> NOTNESTEDCACHE = new HashMap<String, Method>();
public static Object getProperty(Object bean, String attr)
throws Exception {
String key = bean.getClass().getName() + "#" + attr;
if (attr.indexOf('.') == -1) {
Method readMethod = NOTNESTEDCACHE.get(key);
if (readMethod != null) {
return readMethod.invoke(bean);
}
}
Method readMethod = null;
Object value = null;
value = bean;
for (String part : attr.split("\\.")) {
PropertyDescriptor desc = getPropertyDescriptor(value.getClass(),
part);
if (desc != null) {
readMethod = desc.getReadMethod();
}
if (readMethod == null) {
throw new IllegalArgumentException("Attribute '" + part
+ "' is not known in '" + value + "'");
} else {
value = readMethod.invoke(value);
}
}
if (attr.indexOf('.') == -1) {
NOTNESTEDCACHE.put(key,readMethod);
}
return value;
}
private static PropertyDescriptor getPropertyDescriptor(Class<?> clazz,
String name) throws IntrospectionException {
PropertyDescriptor[] descs = getPropertyDescriptor(clazz);
for (PropertyDescriptor desc : descs) {
if (desc.getName().equals(name)) {
return desc;
}
}
return null;
}
private static PropertyDescriptor[] getPropertyDescriptor(Class<?> clazz)
throws IntrospectionException {
return Introspector.getBeanInfo(clazz).getPropertyDescriptors();
}
}