<AWT Dev> [9] Review Request: JDK-6463901 Either generify or deprecate sun.awt.EventListenerAggregate

Petr Pchelko petr.pchelko at oracle.com
Wed Mar 26 08:13:06 UTC 2014


Hello,

Looks like I forgot to actually add a link to the new version. Here it is: http://cr.openjdk.java.net/~pchelko/9/6463901/webrev.02/

With best regards. Petr.


On 19.03.2014, at 12:44, Petr Pchelko <petr.pchelko at oracle.com> wrote:

> Hello, Anthony, Sergey.
> 
> Thank you for the review.
> 
>> Now that the flavorListeners is never null, I believe that the condition should check the value of currentDataFlavors, rather than rely on emptiness of the listeners collection: note that there's removeListener method, so the collection may become empty again, and we don't want to reinitialize the currentDataFlavors for the second time.
> I'm now initializing it in the constructor, the same time as the list is initialized.
> 
>> As for the Set vs. List issue, note that Set implementations generally do not guarantee a particular iteration order - it may change after adding/removing listeners. This is particularly true for hash-based collections. So if we use a HashSet, listeners added by other code could be executed in different order at different times which could confuse some applications (maybe?). Since we don't expect a large number of listeners to be added to the collection, I don't think that removing a listener would be a bottle-neck (and this is the only operation that actually benefits from using HashSet in this code). So personally, I'd choose a List instead. But I don't have a strong opinion on this.
> I don't think the iteration order would have any effect on the applications. The only reason I'm choosing a Set is to avoid duplicated notifications in case 2 identical listeners were accidentally added. It's actually would be a bug in the client code, so I'm OK to replace the Set with the List if you think it would be better.
> 
> With best regards. Petr.
> 
> On 18.03.2014, at 23:07, Anthony Petrov <anthony.petrov at oracle.com> wrote:
> 
>> Hi Petr,
>> 
>>> 259         if (flavorListeners.isEmpty()) {
>>> 260             currentDataFlavors = getAvailableDataFlavorSet();
>>> 
>>> 261         }
>>> 262         flavorListeners.add(listener);
>> 
>> Now that the flavorListeners is never null, I believe that the condition should check the value of currentDataFlavors, rather than rely on emptiness of the listeners collection: note that there's removeListener method, so the collection may become empty again, and we don't want to reinitialize the currentDataFlavors for the second time.
>> 
>> As for the Set vs. List issue, note that Set implementations generally do not guarantee a particular iteration order - it may change after adding/removing listeners. This is particularly true for hash-based collections. So if we use a HashSet, listeners added by other code could be executed in different order at different times which could confuse some applications (maybe?). Since we don't expect a large number of listeners to be added to the collection, I don't think that removing a listener would be a bottle-neck (and this is the only operation that actually benefits from using HashSet in this code). So personally, I'd choose a List instead. But I don't have a strong opinion on this.
>> 
>> --
>> best regards,
>> Anthony
>> 
>> On 3/18/2014 7:47 PM, Sergey Bylokhov wrote:
>>> On 3/18/14 7:44 PM, Petr Pchelko wrote:
>>>> Hello, Sergey.
>>>> 
>>>> Thank you for the review.
>>>> The updated version is located here:
>>>> http://cr.openjdk.java.net/~pchelko/9/6463901/webrev.01/
>>>> 
>>>> It addresses both of your comments.
>>> I am curious why Set and not a List(ArrayList)?
>>>> 
>>>> With best regards. Petr.
>>>> 
>>>> On 18.03.2014, at 19:06, Sergey Bylokhov <Sergey.Bylokhov at oracle.com>
>>>> wrote:
>>>> 
>>>>> Hi, Petr.
>>>>> 
>>>>> A few notes:
>>>>> 
>>>>> 314         if (prevDataFlavors != null && currentDataFlavors != null
>>>>> 315                 && prevDataFlavors.equals(currentDataFlavors)) {
>>>>> 316             return;
>>>>> 317         }
>>>>> 
>>>>> I suppose we should return in case both of them will be null?
>>>>> Objects.equals should be a little bit more readable here.
>>>>> 
>>>>> 
>>>>> 440                 flavorListeners.stream()
>>>>> 441                         .filter(Objects::nonNull)
>>>>> 442                         .forEach(listener ->
>>>>> SunToolkit.postEvent(appContext,
>>>>> 443                                 new PeerEvent(this,
>>>>> 444                                         () ->
>>>>> listener.flavorsChanged(new FlavorEvent(SunClipboard.this)),
>>>>> 445                                         PeerEvent.PRIORITY_EVENT)));
>>>>> 
>>>>> here is a place where we can reformat it to be more readable.
>>>>> 
>>>>> On 18.03.2014 18:34, Petr Pchelko wrote:
>>>>>> Hello, AWT Team.
>>>>>> 
>>>>>> Please review the fix for the issue:
>>>>>> https://bugs.openjdk.java.net/browse/JDK-6463901
>>>>>> The fix is available at:
>>>>>> http://cr.openjdk.java.net/~pchelko/9/6463901/webrev/
>>>>>> 
>>>>>> The bug states that we should deprecate or generify the
>>>>>> EventListenerAggregate class.
>>>>>> However it's an internal class in sun.awt package so we could remove
>>>>>> it.
>>>>>> 
>>>>>> I've used grep on JDK source to verify that this class is not used
>>>>>> any more.
>>>>>> Clipboard regression, functional and JCK tests run fine.
>>>>>> 
>>>>>> With best regards. Petr.
>>>>>> 
>>>>> 
>>>>> --
>>>>> Best regards, Sergey.
>>>>> 
>>> 
>>> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/awt-dev/attachments/20140326/84819c13/attachment-0001.html>


More information about the awt-dev mailing list