PropertyDescriptor.java
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* This class was copied from OpenBeans (Apache Harmony) and modified to
* avoid using java.beans package, because it is not available on some
* platforms (Android in particular).
*/
package com.rometools.rome.feed.impl;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class PropertyDescriptor {
private final String name;
private final Method getter;
private final Method setter;
public PropertyDescriptor(String name, Method getter, Method setter) {
if (name == null || name.isEmpty()) {
throw new IllegalArgumentException("Bad property name");
}
this.name = name;
this.getter = checkGetter(getter);
this.setter = checkSetter(setter);
}
public String getName() {
return name;
}
public Method getReadMethod() {
return getter;
}
public Method getWriteMethod() {
return setter;
}
public Class<?> getPropertyType() {
if (getter != null) {
return getter.getReturnType();
} else if (setter != null) {
Class<?>[] parameterTypes = setter.getParameterTypes();
return parameterTypes[0];
} else {
return null;
}
}
private Method checkGetter(Method method) {
if (method != null) {
int modifiers = method.getModifiers();
if (!Modifier.isPublic(modifiers)) {
throw new IllegalArgumentException("Modifier for getter method should be public");
}
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length != 0) {
throw new IllegalArgumentException("Number of parameters in getter method is not equal to 0");
}
Class<?> returnType = method.getReturnType();
if (returnType.equals(Void.TYPE)) {
throw new IllegalArgumentException("Getter has return type void");
}
Class<?> propertyType = getPropertyType();
if (propertyType != null && !returnType.equals(propertyType)) {
throw new IllegalArgumentException("Parameter type in getter does not correspond to setter");
}
}
return method;
}
private Method checkSetter(Method method) {
if (method != null) {
int modifiers = method.getModifiers();
if (!Modifier.isPublic(modifiers)) {
throw new IllegalArgumentException("Modifier for setter method should be public");
}
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length != 1) {
throw new IllegalArgumentException("Number of parameters in setter method is not equal to 1");
}
Class<?> parameterType = parameterTypes[0];
Class<?> propertyType = getPropertyType();
if (propertyType != null && !propertyType.equals(parameterType)) {
throw new IllegalArgumentException("Parameter type in setter does not correspond to getter");
}
}
return method;
}
}