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.pet...@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.bylok...@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. >>>> >> >>