|
|
// First, a change to alias creation to also do the camelCase versions:
private static void assignAliases(MethodCallback callback, Map assignedNames) {
String name = callback.name;
addUnassignedAlias(getRubyCasedName(name),assignedNames,callback);
// logic adapted from java.beans.Introspector
if (!(name.length() > 3 || name.startsWith("is")))
return;
for (Iterator iter = callback.methods.iterator(); iter.hasNext(); ) {
Method method = (Method)iter.next();
Class[] argTypes = method.getParameterTypes();
Class resultType = method.getReturnType();
int argCount = argTypes.length;
String javaPropertyName = getJavaPropertyName(name);
if (javaPropertyName == null) continue; // not a Java property name, done with this method
if (argCount == 0) {
if (name.startsWith("get")) {
// ruby_case
addUnassignedAlias(getRubyCasedName(javaPropertyName),assignedNames,callback);
// camelCase
addUnassignedAlias(javaPropertyName,assignedNames,callback);
} else if (resultType == boolean.class && name.startsWith("is")) {
// ruby_case
String rubyName = getRubyCasedName(name.substring(2));
if (rubyName != null) {
addUnassignedAlias(rubyName,assignedNames,callback);
addUnassignedAlias(rubyName+'?',assignedNames,callback);
}
// camelCase
addUnassignedAlias(javaPropertyName,assignedNames,callback);
addUnassignedAlias(javaPropertyName+'?',assignedNames,callback);
}
} else if (argCount == 1) {
// indexed get
if (argTypes[0] == int.class && name.startsWith("get")) {
// ruby_case
addUnassignedAlias(getRubyCasedName(name.substring(3)),assignedNames,callback);
// camelCase
addUnassignedAlias(javaPropertyName,assignedNames,callback);
} else if (resultType == void.class && name.startsWith("set")) {
// ruby_case
String rubyName = getRubyCasedName(name.substring(3));
if (rubyName != null) {
addUnassignedAlias(rubyName + '=',assignedNames,callback);
}
// camelCase
addUnassignedAlias(javaPropertyName + '=',assignedNames,callback);
}
}
}
}
// And then an added method to split off the "property name" from the bean-compatible method name:
private static final Pattern JAVA_PROPERTY_CHOPPER = Pattern.compile("(get|set|is)([A-Z0-9])(.*)");
public static String getJavaPropertyName(String beanMethodName) {
Matcher m = JAVA_PROPERTY_CHOPPER.matcher(beanMethodName);
if (!m.find()) return null;
String javaPropertyName = m.group(2).toLowerCase() + m.group(3);
return javaPropertyName;
}
|