/* * Copyright (C) 2011 Peransin Nicolas. * Use is subject to license terms. */ package org.mypsycho.beans; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import org.apache.commons.beanutils.DynaBean; /** * Class for ... * <p>Details</p> * * @author Peransin Nicolas */ public class DescriptorExtension extends PropertyDescriptor { PropertyDescriptor delegate = null; Invoker invoker = DefaultInvoker.getInstance(); String canon = null; Class<?> type = null; /** * Constructor. * * @param applicable type applicable * @param propName property name * @param parent the delegating * @throws IntrospectionException */ public DescriptorExtension(Class<?> applicable, String propName, PropertyDescriptor parent) throws IntrospectionException { super(propName, (parent != null) ? parent.getReadMethod() : null, (parent != null) ? parent.getWriteMethod() : null); type = applicable; delegate = parent; } /** * Constructor. * * @param applicable type applicable * @param propName property name * @throws IntrospectionException */ public DescriptorExtension(Class<?> type, String propName, boolean override) throws IntrospectionException { this(type, propName, override ? new PropertyDescriptor(propName, type) : null); } /** * Constructor. * * @param applicable type applicable * @param propName property name * @throws IntrospectionException */ public DescriptorExtension(Class<?> type, String propName) throws IntrospectionException { this(type, propName, false); } void delegateRequired(String method) throws NoSuchMethodException { if (delegate == null) { throw new NoSuchMethodException("Property '" + getName() + "' has no " + method + " method on bean class '" + type.getName() + "'"); } } public String getCanonicalName() { if (canon == null) { canon = type.getCanonicalName() + "#" + getName(); } return canon; } public Class<?> getType() { return type; } @Override public Class<?> getPropertyType() { return (delegate == null) ? null : invoker.getPropertyType(delegate, false); } public Class<?> getPropertyType(boolean collection) { return (delegate == null) ? null : invoker.getPropertyType(delegate, collection); } public Object get(Object bean) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { delegateRequired("getter"); return invoker.get(bean, delegate); } public void set(Object bean, Object value) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { delegateRequired("setter"); invoker.set(bean, delegate, value); } public Object get(Object bean, int index) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { delegateRequired("indexed getter"); return invoker.get(bean, delegate, index); } public void set(Object bean, int index, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { delegateRequired("indexed setter"); invoker.set(bean, delegate, index, value); } public Object get(Object bean, String key) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { delegateRequired("getter"); return invoker.get(bean, delegate, key); } public void set(Object bean, String key, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { delegateRequired("setter"); invoker.set(bean, delegate, key, value); } public boolean isWriteable(Object bean, boolean collection) { return (delegate == null) ? false : invoker.isWriteable(bean, delegate, collection); } /** * <p> * Return <code>true</code> if the specified property name identifies a readable property on the * specified bean; otherwise, return <code>false</code>. * * @param bean Bean to be examined (may be a {@link DynaBean} * @param name Property name to be evaluated * @return <code>true</code> if the property is readable, * otherwise <code>false</code> * @exception IllegalArgumentException if <code>bean</code> or <code>name</code> is * <code>null</code> */ public boolean isReadable(Object bean, boolean collection) { return (delegate == null) ? false : invoker.isReadable(bean, delegate, collection); } /** * Do something TODO. * <p> * Details of the function. * </p> * * @return */ public boolean isCollection() { return (delegate == null) ? false : invoker.isCollection(delegate); } }