Hi Petr,

Thank you for your review.

Regards,
Alexey.

On 15.04.2014 15:13, Petr Pchelko wrote:
Hello, Alexey.

I’m fine with your fix.

Thank you for filing a new bug for JDK 9.

With best regards. Petr.

15 апр. 2014 г., в 3:02 после полудня, Alexey Ivanov <[email protected]> 
написал(а):

Hi Petr,

Please look at the updated webrev with comment explaining why additional 'if' 
clause is added:
http://cr.openjdk.java.net/~dmarkov/8024061/jdk9/webrev.01/

I have submitted a new bug JDK-8040248:
"Drag and drop between two components fails if performed quickly"
https://bugs.openjdk.java.net/browse/JDK-8040248

Regards,
Alexey.

On 10.04.2014 18:31, Petr Pchelko wrote:
Hello, Alexey.

Thank you for the clarification.

What actually happens is that native drag-and-drop operation completed already 
whereas this drag-and-drop operation on EDT didn't even started yet. Does 
throwing InvalidDnDOperationException look more appropriate than returning null 
in this case?
No, I think it’s not good. As a workaround it’s better to not return the data 
than to throw an exception. It would be really hard for the users to deal with 
such an exception.

Please add some comment to the if clause to clarify what’s happening.
Otherwise the fix looks good to me.

With best regards. Petr.

10 апр. 2014 г., в 5:39 после полудня, Alexey Ivanov <[email protected]> 
написал(а):

Hi Petr,

If the requested data flavor is DataFlavor.javaJVMLocalObjectMimeType, then transferable 
is local to the JVM. It is stored to a static variable in 
SunDropTargetContextPeer.setCurrentJVMLocalSourceTransferable(). When 
processEnterMessage() is handled, its value is copied to instance variable 
"local". The instance variable is cleaned by processExitMessage(), the static 
variable is cleared by SunDragSourceContextPeer.cleanup().

If drag-and-drop operation is performed quickly, SunDragSourceContextPeer.cleanup() is 
called when mouse button is released and *before* processEnterMessage() is called. So 
when EDT finally handles MOUSE_ENTERED event and DropTargetListener.dragEnter() gets 
called, "local" transferable is already null. The listener tries to get the 
data from the transferable:
DropTargetDragEvent.getTransferable(), and then
Transferable.getTransferData(dataFlavor).

The dataFlavor has MIME type of DataFlavor.javaJVMLocalObjectMimeType, and 
SunDropTargetContextPeer.currentJVMLocalSourceTransferable is already cleared. 
The representationClass field of the DataFlavor object is set to 
java.io.InputStream.class. So when SunDropTargetContextPeer.getNativeData() 
executes it tries to cast the data object to java.io.InputStream to deserialize 
the data but fails with the exception:
java.lang.ClassCastException: DnD$DropObject cannot be cast to 
java.io.InputStream.

This exception is caught internally, and IOException is thrown as it failed to 
get the data. At the same time, no IO should have occurred because a local 
source was dragged, so this exception is rather unexpected.


What actually happens is that native drag-and-drop operation completed already 
whereas this drag-and-drop operation on EDT didn't even started yet. Does 
throwing InvalidDnDOperationException look more appropriate than returning null 
in this case?


Sure, I'll submit a new bug for 9 to implement the proper fix.


Regards,
Alexey.

On 10.04.2014 12:52, Petr Pchelko wrote:
Hello, Dmitry.

Thank you for the detailed explanation of the issue.

I’m OK with this workaround as this should be back ported to 8u and 7u, but I 
think we could try to provide a real fix in 9.
Could you please add some comment which shortly explains why the if clause was 
added?
And could you also file a new bug for 9 so that we try to replace the 
workaround with a real fix?

Thank you.
With best regards. Petr.

10 апр. 2014 г., в 12:18 после полудня, Alexey Ivanov 
<[email protected]> написал(а):

Hello AWT team,

Could you please review the fix for jdk9:
    bug: https://bugs.openjdk.java.net/browse/JDK-8024061
    webrev: http://cr.openjdk.java.net/~dmarkov/8024061/jdk9/webrev.00/

Problem description:
Dragging and dropping an object from one panel to another very quickly causes 
an exception.

Fix:
The fix addresses only the thrown exception.
The dragged object would not be moved.


Thanks,
Alexey.

Reply via email to