FileDocCategorySizeDatePackage
IndexedPropertyDescriptor.javaAPI DocJava SE 5 API16477Fri Aug 26 14:56:56 BST 2005java.beans

IndexedPropertyDescriptor

public class IndexedPropertyDescriptor extends PropertyDescriptor
An IndexedPropertyDescriptor describes a property that acts like an array and has an indexed read and/or indexed write method to access specific elements of the array.

An indexed property may also provide simple non-indexed read and write methods. If these are present, they read and write arrays of the type returned by the indexed read method.

Fields Summary
private Reference
indexedPropertyTypeRef
private Reference
indexedReadMethodRef
private Reference
indexedWriteMethodRef
private String
indexedReadMethodName
private String
indexedWriteMethodName
Constructors Summary
public IndexedPropertyDescriptor(String propertyName, Class beanClass)
This constructor constructs an IndexedPropertyDescriptor for a property that follows the standard Java conventions by having getFoo and setFoo accessor methods, for both indexed access and array access.

Thus if the argument name is "fred", it will assume that there is an indexed reader method "getFred", a non-indexed (array) reader method also called "getFred", an indexed writer method "setFred", and finally a non-indexed writer method "setFred".

param
propertyName The programmatic name of the property.
param
beanClass The Class object for the target bean.
exception
IntrospectionException if an exception occurs during introspection.

	this(propertyName, beanClass,
			 "get" + capitalize(propertyName),
			 "set" + capitalize(propertyName),
			 "get" + capitalize(propertyName),
			 "set" + capitalize(propertyName));
    
IndexedPropertyDescriptor(PropertyDescriptor x, PropertyDescriptor y)
Package-private constructor. Merge two property descriptors. Where they conflict, give the second argument (y) priority over the first argumnnt (x).

param
x The first (lower priority) PropertyDescriptor
param
y The second (higher priority) PropertyDescriptor

	super(x,y);
	if (x instanceof IndexedPropertyDescriptor) {
	    IndexedPropertyDescriptor ix = (IndexedPropertyDescriptor)x;
	    try {
		Method xr = ix.getIndexedReadMethod();
		if (xr != null) {
		    setIndexedReadMethod(xr);
		}
		
		Method xw = ix.getIndexedWriteMethod();
		if (xw != null) {
		    setIndexedWriteMethod(xw);
		}
	    } catch (IntrospectionException ex) {
		// Should not happen
		throw new AssertionError(ex);
	    }
	}
	if (y instanceof IndexedPropertyDescriptor) {
	    IndexedPropertyDescriptor iy = (IndexedPropertyDescriptor)y;
	    try {
		Method yr = iy.getIndexedReadMethod();
		if (yr != null && yr.getDeclaringClass() == getClass0()) {
		    setIndexedReadMethod(yr);
		}
		
		Method yw = iy.getIndexedWriteMethod();
		if (yw != null && yw.getDeclaringClass() == getClass0()) {
		    setIndexedWriteMethod(yw);
		}
	    } catch (IntrospectionException ex) {
		// Should not happen
		throw new AssertionError(ex);
	    }
	}
    
IndexedPropertyDescriptor(IndexedPropertyDescriptor old)

	super(old);
	indexedReadMethodRef = old.indexedReadMethodRef;
	indexedWriteMethodRef = old.indexedWriteMethodRef;
	indexedPropertyTypeRef = old.indexedPropertyTypeRef;
	indexedWriteMethodName = old.indexedWriteMethodName;
	indexedReadMethodName = old.indexedReadMethodName;
    
public IndexedPropertyDescriptor(String propertyName, Class beanClass, String readMethodName, String writeMethodName, String indexedReadMethodName, String indexedWriteMethodName)
This constructor takes the name of a simple property, and method names for reading and writing the property, both indexed and non-indexed.

param
propertyName The programmatic name of the property.
param
beanClass The Class object for the target bean.
param
readMethodName The name of the method used for reading the property values as an array. May be null if the property is write-only or must be indexed.
param
writeMethodName The name of the method used for writing the property values as an array. May be null if the property is read-only or must be indexed.
param
indexedReadMethodName The name of the method used for reading an indexed property value. May be null if the property is write-only.
param
indexedWriteMethodName The name of the method used for writing an indexed property value. May be null if the property is read-only.
exception
IntrospectionException if an exception occurs during introspection.

	super(propertyName, beanClass, readMethodName, writeMethodName);

	this.indexedReadMethodName = indexedReadMethodName;
	if (indexedReadMethodName != null && getIndexedReadMethod() == null) {
	    throw new IntrospectionException("Method not found: " + indexedReadMethodName);
	}

	this.indexedWriteMethodName = indexedWriteMethodName;
	if (indexedWriteMethodName != null && getIndexedWriteMethod() == null) {
	    throw new IntrospectionException("Method not found: " + indexedWriteMethodName);
	}
	// Implemented only for type checking.
	findIndexedPropertyType(getIndexedReadMethod(), getIndexedWriteMethod());
    
public IndexedPropertyDescriptor(String propertyName, Method readMethod, Method writeMethod, Method indexedReadMethod, Method indexedWriteMethod)
This constructor takes the name of a simple property, and Method objects for reading and writing the property.

param
propertyName The programmatic name of the pro perty.
param
readMethod The method used for reading the property values as an array. May be null if the property is write-only or must be indexed.
param
writeMethod The method used for writing the property values as an array. May be null if the property is read-only or must be indexed.
param
indexedReadMethod The method used for reading an indexed property value. May be null if the property is write-only.
param
indexedWriteMethod The method used for writing an indexed property value. May be null if the property is read-only.
exception
IntrospectionException if an exception occurs during introspection.

	super(propertyName, readMethod, writeMethod);

	setIndexedReadMethod0(indexedReadMethod);
	setIndexedWriteMethod0(indexedWriteMethod);

	// Type checking
	setIndexedPropertyType(findIndexedPropertyType(indexedReadMethod, indexedWriteMethod));
    
Methods Summary
public booleanequals(java.lang.Object obj)
Compares this PropertyDescriptor against the specified object. Returns true if the objects are the same. Two PropertyDescriptors are the same if the read, write, property types, property editor and flags are equivalent.

since
1.4

	// Note: This would be identical to PropertyDescriptor but they don't
	// share the same fields.
	if (this == obj) {
	    return true;
	}

	if (obj != null && obj instanceof IndexedPropertyDescriptor) {
	    IndexedPropertyDescriptor other = (IndexedPropertyDescriptor)obj;
	    Method otherIndexedReadMethod = other.getIndexedReadMethod();
	    Method otherIndexedWriteMethod = other.getIndexedWriteMethod();

	    if (!compareMethods(getIndexedReadMethod(), otherIndexedReadMethod)) {
		return false;
	    }

	    if (!compareMethods(getIndexedWriteMethod(), otherIndexedWriteMethod)) {
		return false;
	    }

	    if (getIndexedPropertyType() != other.getIndexedPropertyType()) {
		return false;
	    }
	    return super.equals(obj);
	}
	return false;
    
private java.lang.ClassfindIndexedPropertyType(java.lang.reflect.Method indexedReadMethod, java.lang.reflect.Method indexedWriteMethod)

	Class indexedPropertyType = null;

	if (indexedReadMethod != null) {
	    Class params[] = indexedReadMethod.getParameterTypes();
	    if (params.length != 1) {
		throw new IntrospectionException("bad indexed read method arg count");
	    }
	    if (params[0] != Integer.TYPE) {
		throw new IntrospectionException("non int index to indexed read method");
	    }
	    indexedPropertyType = indexedReadMethod.getReturnType();
	    if (indexedPropertyType == Void.TYPE) {
		throw new IntrospectionException("indexed read method returns void");
	    }
	}
	if (indexedWriteMethod != null) {
	    Class params[] = indexedWriteMethod.getParameterTypes();
	    if (params.length != 2) {
		throw new IntrospectionException("bad indexed write method arg count");
	    }
	    if (params[0] != Integer.TYPE) {
		throw new IntrospectionException("non int index to indexed write method");
	    }
	    if (indexedPropertyType != null && indexedPropertyType != params[1]) {
		throw new IntrospectionException(
						 "type mismatch between indexed read and indexed write methods: " 
						 + getName());
	    }
	    indexedPropertyType = params[1];
	}
	Class propertyType = getPropertyType();
	if (propertyType != null && (!propertyType.isArray() ||
				     propertyType.getComponentType() != indexedPropertyType)) {
	    throw new IntrospectionException("type mismatch between indexed and non-indexed methods: " 
					     + getName());
	}
	return indexedPropertyType;
    
public synchronized java.lang.ClassgetIndexedPropertyType()
Gets the Class object of the indexed properties' type. The returned Class may describe a primitive type such as int.

return
The Class for the indexed properties' type; may return null if the type cannot be determined.

	Class type = getIndexedPropertyType0();
	if (type == null) {
	    try {
		type = findIndexedPropertyType(getIndexedReadMethod(), 
					       getIndexedWriteMethod());
		setIndexedPropertyType(type);
	    } catch (IntrospectionException ex) {
		// fall
	    }
	}
	return type;
    
private java.lang.ClassgetIndexedPropertyType0()

	return (Class)getObject(indexedPropertyTypeRef);
    
public synchronized java.lang.reflect.MethodgetIndexedReadMethod()
Gets the method that should be used to read an indexed property value.

return
The method that should be used to read an indexed property value. May return null if the property isn't indexed or is write-only.

	Method indexedReadMethod = getIndexedReadMethod0();
	if (indexedReadMethod == null) {
	    Class cls = getClass0();
	    if (cls == null || 
		(indexedReadMethodName == null && indexedReadMethodRef == null)) {
		// the Indexed readMethod was explicitly set to null.
		return null;
	    }
	    if (indexedReadMethodName == null) {
		Class type = getIndexedPropertyType0();
		if (type == boolean.class || type == null) {
		    indexedReadMethodName = "is" + getBaseName();
		} else {
		    indexedReadMethodName = "get" + getBaseName();
		}
	    }
	    
	    Class[] args = { int.class };
	    
	    indexedReadMethod = Introspector.findMethod(cls, indexedReadMethodName, 
							1, args);
	    if (indexedReadMethod == null) {
		// no "is" method, so look for a "get" method.
		indexedReadMethodName = "get" + getBaseName();
		indexedReadMethod = Introspector.findMethod(cls, indexedReadMethodName, 
							    1, args);
	    }
	    setIndexedReadMethod0(indexedReadMethod);
	}
	return indexedReadMethod;
    
private java.lang.reflect.MethodgetIndexedReadMethod0()

	return (Method)getObject(indexedReadMethodRef);
    
public synchronized java.lang.reflect.MethodgetIndexedWriteMethod()
Gets the method that should be used to write an indexed property value.

return
The method that should be used to write an indexed property value. May return null if the property isn't indexed or is read-only.

	Method indexedWriteMethod = getIndexedWriteMethod0();
	if (indexedWriteMethod == null) {
	    Class cls = getClass0();
	    if (cls == null || 
		(indexedWriteMethodName == null && indexedWriteMethodRef == null)) {
		// the Indexed writeMethod was explicitly set to null.
		return null;
	    }

	    // We need the indexed type to ensure that we get the correct method.
	    // Cannot use the getIndexedPropertyType method since that could 
	    // result in an infinite loop.
	    Class type = getIndexedPropertyType0();
	    if (type == null) {
		try {
		    type = findIndexedPropertyType(getIndexedReadMethod(), null);
		    setIndexedPropertyType(type);
		} catch (IntrospectionException ex) {
		    // Set iprop type to be the classic type
		    Class propType = getPropertyType();
		    if (propType.isArray()) {
			type = propType.getComponentType();
		    }
		}
	    }
		
	    if (indexedWriteMethodName == null) {
		indexedWriteMethodName = "set" + getBaseName();
	    }
	    indexedWriteMethod = Introspector.findMethod(cls, indexedWriteMethodName, 
			 2, (type == null) ? null : new Class[] { int.class, type });
	    setIndexedWriteMethod0(indexedWriteMethod);
	}
	return indexedWriteMethod;
    
private java.lang.reflect.MethodgetIndexedWriteMethod0()

	return (Method)getObject(indexedWriteMethodRef);
    
public inthashCode()
Returns a hash code value for the object. See {@link java.lang.Object#hashCode} for a complete description.

return
a hash code value for this object.
since
1.5

	int result = super.hashCode();

	result = 37 * result + ((indexedWriteMethodName == null) ? 0 : 
				indexedWriteMethodName.hashCode());
	result = 37 * result + ((indexedReadMethodName == null) ? 0 : 
				indexedReadMethodName.hashCode());
	result = 37 * result + ((getIndexedPropertyType() == null) ? 0 : 
				getIndexedPropertyType().hashCode());
	
	return result;
    
private voidsetIndexedPropertyType(java.lang.Class type)

	indexedPropertyTypeRef = createReference(type);
    
public synchronized voidsetIndexedReadMethod(java.lang.reflect.Method readMethod)
Sets the method that should be used to read an indexed property value.

param
readMethod The new indexed read method.


	// the indexed property type is set by the reader.
	setIndexedPropertyType(findIndexedPropertyType(readMethod, 
						       getIndexedWriteMethod0()));
	setIndexedReadMethod0(readMethod);
    
private voidsetIndexedReadMethod0(java.lang.reflect.Method readMethod)

	if (readMethod == null) {
	    indexedReadMethodName = null;
	    indexedReadMethodRef = null;
	    return;
	}
	setClass0(readMethod.getDeclaringClass());

	indexedReadMethodName = readMethod.getName();
	indexedReadMethodRef = createReference(readMethod);
    
public synchronized voidsetIndexedWriteMethod(java.lang.reflect.Method writeMethod)
Sets the method that should be used to write an indexed property value.

param
writeMethod The new indexed write method.


	// If the indexed property type has not been set, then set it.
	Class type = findIndexedPropertyType(getIndexedReadMethod(), 
					     writeMethod);
	setIndexedPropertyType(type);
	setIndexedWriteMethod0(writeMethod);
    
private voidsetIndexedWriteMethod0(java.lang.reflect.Method writeMethod)

	if (writeMethod == null) {
	    indexedWriteMethodName = null;
	    indexedWriteMethodRef = null;
	    return;
	}
	setClass0(writeMethod.getDeclaringClass());

	indexedWriteMethodName = writeMethod.getName();
	indexedWriteMethodRef = createReference(writeMethod);