--- old/src/share/classes/sun/awt/datatransfer/SunClipboard.java 2014-03-19 12:37:12.000000000 +0400 +++ new/src/share/classes/sun/awt/datatransfer/SunClipboard.java 2014-03-19 12:37:12.000000000 +0400 @@ -40,7 +40,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.Iterator; +import java.util.Objects; import java.util.Set; import java.util.HashSet; @@ -49,7 +49,6 @@ import sun.awt.AppContext; import sun.awt.PeerEvent; import sun.awt.SunToolkit; -import sun.awt.EventListenerAggregate; /** @@ -110,11 +109,7 @@ setContentsNative(contents); } finally { if (oldOwner != null && oldOwner != owner) { - EventQueue.invokeLater(new Runnable() { - public void run() { - oldOwner.lostOwnership(SunClipboard.this, oldContents); - } - }); + EventQueue.invokeLater(() -> oldOwner.lostOwnership(SunClipboard.this, oldContents)); } } } @@ -358,13 +353,12 @@ return; } AppContext appContext = AppContext.getAppContext(); - EventListenerAggregate contextFlavorListeners = (EventListenerAggregate) - appContext.get(CLIPBOARD_FLAVOR_LISTENER_KEY); - if (contextFlavorListeners == null) { - contextFlavorListeners = new EventListenerAggregate(FlavorListener.class); - appContext.put(CLIPBOARD_FLAVOR_LISTENER_KEY, contextFlavorListeners); + Set flavorListeners = getFlavorListeners(appContext); + if (flavorListeners == null) { + flavorListeners = new HashSet<>(); + appContext.put(CLIPBOARD_FLAVOR_LISTENER_KEY, flavorListeners); } - contextFlavorListeners.add(listener); + flavorListeners.add(listener); if (numberOfFlavorListeners++ == 0) { long[] currentFormats = null; @@ -385,25 +379,26 @@ if (listener == null) { return; } - AppContext appContext = AppContext.getAppContext(); - EventListenerAggregate contextFlavorListeners = (EventListenerAggregate) - appContext.get(CLIPBOARD_FLAVOR_LISTENER_KEY); - if (contextFlavorListeners == null){ + Set flavorListeners = getFlavorListeners(AppContext.getAppContext()); + if (flavorListeners == null){ //else we throw NullPointerException, but it is forbidden return; } - if (contextFlavorListeners.remove(listener) && - --numberOfFlavorListeners == 0) { + if (flavorListeners.remove(listener) && --numberOfFlavorListeners == 0) { unregisterClipboardViewerChecked(); currentDataFlavors = null; } } + @SuppressWarnings("unchecked") + private Set getFlavorListeners(AppContext appContext) { + return (Set)appContext.get(CLIPBOARD_FLAVOR_LISTENER_KEY); + } + public synchronized FlavorListener[] getFlavorListeners() { - EventListenerAggregate contextFlavorListeners = (EventListenerAggregate) - AppContext.getAppContext().get(CLIPBOARD_FLAVOR_LISTENER_KEY); - return contextFlavorListeners == null ? new FlavorListener[0] : - (FlavorListener[])contextFlavorListeners.getListenersCopy(); + Set flavorListeners = getFlavorListeners(AppContext.getAppContext()); + return flavorListeners == null ? new FlavorListener[0] + : flavorListeners.toArray(new FlavorListener[flavorListeners.size()]); } public boolean areFlavorListenersRegistered() { @@ -424,49 +419,32 @@ * @param formats data formats that have just been retrieved from * this clipboard */ - public void checkChange(long[] formats) { + public synchronized void checkChange(long[] formats) { Set prevDataFlavors = currentDataFlavors; currentDataFlavors = formatArrayAsDataFlavorSet(formats); - if ((prevDataFlavors != null) && (currentDataFlavors != null) && - prevDataFlavors.equals(currentDataFlavors)) { + if (Objects.equals(prevDataFlavors, currentDataFlavors)) { // we've been able to successfully get available on the clipboard // DataFlavors this and previous time and they are coincident; // don't notify return; } - class SunFlavorChangeNotifier implements Runnable { - private final FlavorListener flavorListener; - - SunFlavorChangeNotifier(FlavorListener flavorListener) { - this.flavorListener = flavorListener; - } - - public void run() { - if (flavorListener != null) { - flavorListener.flavorsChanged(new FlavorEvent(SunClipboard.this)); - } - } - }; - - for (Iterator it = AppContext.getAppContexts().iterator(); it.hasNext();) { - AppContext appContext = (AppContext)it.next(); + for (AppContext appContext : AppContext.getAppContexts()) { if (appContext == null || appContext.isDisposed()) { continue; } - EventListenerAggregate flavorListeners = (EventListenerAggregate) - appContext.get(CLIPBOARD_FLAVOR_LISTENER_KEY); + Set flavorListeners = getFlavorListeners(appContext); if (flavorListeners != null) { - FlavorListener[] flavorListenerArray = - (FlavorListener[])flavorListeners.getListenersInternal(); - for (int i = 0; i < flavorListenerArray.length; i++) { - SunToolkit.postEvent(appContext, new PeerEvent(this, - new SunFlavorChangeNotifier(flavorListenerArray[i]), - PeerEvent.PRIORITY_EVENT)); + for (FlavorListener listener : flavorListeners) { + if (listener != null) { + PeerEvent peerEvent = new PeerEvent(this, + () -> listener.flavorsChanged(new FlavorEvent(SunClipboard.this)), + PeerEvent.PRIORITY_EVENT); + SunToolkit.postEvent(appContext, peerEvent); + } } } } } - }