Report abuse


			
// 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;
    }