On Fri, 28 Feb 2025 10:09:30 GMT, Roman Marchenko <rmarche...@openjdk.org> 
wrote:

>> Fixed `com.sun.beans.introspect.MethodInfo#MethodOrder` to make 
>> `Introspector.addMethod()` working properly when filtering methods out.
>> 
>> Also, after PR discussion, added the approptiate test cases with 
>> corresponding fixes in MethodInfo.java and PropertyInfo.java.
>> 
>> ---------
>> `getMethodDescriptors()` returns descriptors of public methods of a class 
>> and its parent classes, including default methods defined in interfaces. The 
>> result doesn't include bridge methods, or methods which were overriden in 
>> subclasses.
>> 
>> `getPropertyDescriptors()` returns descriptors of methods which were 
>> identified as getters or setters. As there can be the only method 
>> getter/setter per property, the following rules are applied when choosing a 
>> getter/setter:
>> 
>> * Getters/setters for the same property defined (not necessarily overriden) 
>> in subclasses have higher precedence.
>> * If there are getters/setters for the same property defined in the same 
>> class and argument types are assignable one to another, the method with the 
>> Least Common Supertype has the lower priority. If argument types are not 
>> assignable, the result is undefined (any method will be chosen).
>
> Roman Marchenko has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   Fixing review comments 2

Changes requested by aivanov (Reviewer).

src/java.desktop/share/classes/com/sun/beans/introspect/PropertyInfo.java line 
81:

> 79:         if (!isInitedToIsGetter && this.readList != null) {
> 80:             for (MethodInfo info : this.readList) {
> 81:                 if ((this.read == null) || (!info.method.isDefault() && 
> this.read.type.isAssignableFrom(info.type))) {

Suggestion:

                if ((this.read == null) || (!info.method.isDefault()
                                            && 
this.read.type.isAssignableFrom(info.type))) {

To avoid a rather long line; wrapping at `||` is also an option.

test/jdk/java/beans/Introspector/DefaultMethodBeanPropertyTest.java line 235:

> 233:         default public void setFoo(String num) {
> 234:         }
> 235:     }

Suggestion:

    public interface A5 {
        public default void setParentFoo(Integer num) {
        }
        public default void setFoo(String num) {
        }
    }

The `public` keyword should precede the `default` keyword in the list of method 
modifiers.

This applies to `A8` and `B8` too.

test/jdk/java/beans/Introspector/DefaultMethodBeanPropertyTest.java line 319:

> 317:     public static void testScenario7() {
> 318:         verifyMethods(D7.class,
> 319:             "public void 
> DefaultMethodBeanPropertyTest$D7.setValue(java.lang.Runnable)"

`getValue` is not included because there's no implementation for it, right?

test/jdk/java/beans/Introspector/DefaultMethodBeanPropertyTest.java line 409:

> 407:                     + expected.stream()
> 408:                             .map(Object::toString)
> 409:                             .collect(Collectors.joining("\n  ")));

Suggestion:

                    + expected.stream()
                              .map(Object::toString)
                              .collect(Collectors.joining("\n  ")));

The dots in chained calls were aligned; they remain aligned for `actual` but 
aren't aligned for `expected`.

test/jdk/java/beans/Introspector/DefaultMethodBeanPropertyTest.java line 417:

> 415:             final Set<String> expected = new 
> HashSet<>(Arrays.asList(methodNames));
> 416:             final Set<String> actual = Arrays
> 417:                     
> .stream(Introspector.getBeanInfo(type).getPropertyDescriptors())

Suggestion:

                    .stream(Introspector.getBeanInfo(type)
                                        .getPropertyDescriptors())

It may be better this way, the call to `getPropertyDescriptors` is clearly 
visible.

test/jdk/java/beans/Introspector/DefaultMethodBeanPropertyTest.java line 418:

> 416:             final Set<String> actual = Arrays
> 417:                     
> .stream(Introspector.getBeanInfo(type).getPropertyDescriptors())
> 418:                     .flatMap(pd -> Arrays.stream(new 
> Method[]{pd.getReadMethod(), pd.getWriteMethod()}))

Suggestion:

                    .flatMap(pd -> Stream.of(pd.getReadMethod(), 
pd.getWriteMethod()))

test/jdk/java/beans/Introspector/DefaultMethodBeanPropertyTest.java line 419:

> 417:                     
> .stream(Introspector.getBeanInfo(type).getPropertyDescriptors())
> 418:                     .flatMap(pd -> Arrays.stream(new 
> Method[]{pd.getReadMethod(), pd.getWriteMethod()}))
> 419:                     .filter(method -> method != null)

Suggestion:

                    .filter(Objects::nonNull)

test/jdk/java/beans/Introspector/DefaultMethodBeanPropertyTest.java line 432:

> 430:             final Set<String> expected = new 
> HashSet<>(Arrays.asList(methodNames));
> 431:             final Set<String> actual = Arrays
> 432:                     .stream(Introspector.getBeanInfo(type, 
> Object.class).getMethodDescriptors())

Suggestion:

                    .stream(Introspector.getBeanInfo(type, Object.class)
                                        .getMethodDescriptors())

-------------

PR Review: https://git.openjdk.org/jdk/pull/23443#pullrequestreview-2704062570
PR Review Comment: https://git.openjdk.org/jdk/pull/23443#discussion_r2006457546
PR Review Comment: https://git.openjdk.org/jdk/pull/23443#discussion_r2006426422
PR Review Comment: https://git.openjdk.org/jdk/pull/23443#discussion_r2006437794
PR Review Comment: https://git.openjdk.org/jdk/pull/23443#discussion_r2006445627
PR Review Comment: https://git.openjdk.org/jdk/pull/23443#discussion_r2006454544
PR Review Comment: https://git.openjdk.org/jdk/pull/23443#discussion_r2006450570
PR Review Comment: https://git.openjdk.org/jdk/pull/23443#discussion_r2006451061
PR Review Comment: https://git.openjdk.org/jdk/pull/23443#discussion_r2006455315

Reply via email to