1 /*
2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25   @test
26   @bug 4422345 8039083
27   @summary tests serialization of DragSourceListeners
28   @author das@sparc.spb.su area=dnd
29   @library ../../../../lib/testlibrary
30   @build jdk.testlibrary.Asserts
31   @run main/othervm DragSourceListenerSerializationTest
32 */
33 
34 import java.awt.Button;
35 import java.awt.Component;
36 import java.awt.Cursor;
37 import java.awt.Point;
38 import java.awt.Toolkit;
39 import java.awt.datatransfer.StringSelection;
40 import java.awt.dnd.DnDConstants;
41 import java.awt.dnd.DragGestureEvent;
42 import java.awt.dnd.DragGestureRecognizer;
43 import java.awt.dnd.DragSource;
44 import java.awt.dnd.DragSourceAdapter;
45 import java.awt.dnd.DragSourceContext;
46 import java.awt.dnd.DragSourceListener;
47 import java.awt.dnd.DragSourceMotionListener;
48 import java.awt.event.InputEvent;
49 import java.awt.event.MouseEvent;
50 import java.io.ByteArrayInputStream;
51 import java.io.ByteArrayOutputStream;
52 import java.io.ObjectInputStream;
53 import java.io.ObjectOutputStream;
54 import java.io.Serializable;
55 import java.util.Arrays;
56 import java.util.TooManyListenersException;
57 import java.util.stream.Collectors;
58 import java.util.stream.Stream;
59 
60 import static jdk.testlibrary.Asserts.assertEquals;
61 
62 public class DragSourceListenerSerializationTest {
main(String[] args)63     public static void main(String[] args) throws Exception {
64         DragSource ds = new DragSource();
65         TestDragSourceAdapter dsa1 = new TestDragSourceAdapter(1);
66         TestDragSourceAdapter dsa2 = new TestDragSourceAdapter(2);
67         Component c = new Button();
68         DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer(c,
69                 DnDConstants.ACTION_COPY,
70                 e -> e.startDrag(null, null));
71         MouseEvent me = new MouseEvent(c, MouseEvent.MOUSE_PRESSED, 0,
72                 InputEvent.CTRL_MASK, 100, 100, 0, false);
73         DragGestureEvent dge = new DragGestureEvent(dgr, DnDConstants.ACTION_COPY,
74                 new Point(100, 100),
75                 Arrays.asList(me));
76         DragSourceContext dsc = new DragSourceContext(
77                 Toolkit.getDefaultToolkit().createDragSourceContextPeer(dge),
78                 dge,
79                 new Cursor(Cursor.HAND_CURSOR),
80                 null, null, new StringSelection("TEXT"), null);
81 
82         ds.addDragSourceListener(dsa1);
83         ds.addDragSourceListener(dsa2);
84         ds.addDragSourceListener(dsa2);
85         ds.addDragSourceMotionListener(dsa1);
86         ds.addDragSourceMotionListener(dsa1);
87         ds.addDragSourceMotionListener(dsa2);
88         dsc.addDragSourceListener(dsa2);
89 
90         byte[] serialized;
91         try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
92              ObjectOutputStream oos = new ObjectOutputStream(bos)) {
93             oos.writeObject(dsc);
94             serialized = bos.toByteArray();
95         }
96 
97         DragSourceContext dsc_copy;
98         try (ByteArrayInputStream bis = new ByteArrayInputStream(serialized);
99              ObjectInputStream ois = new ObjectInputStream(bis)) {
100             dsc_copy = (DragSourceContext) ois.readObject();
101         }
102 
103         try {
104             dsc_copy.addDragSourceListener(dsa1);
105             throw new RuntimeException("Test failed. Listener addition succeeded");
106         } catch (TooManyListenersException ignored) {
107         }
108 
109         try {
110             dsc_copy.addDragSourceListener(dsa2);
111             throw new RuntimeException("Test failed. Listener addition succeeded");
112         } catch (TooManyListenersException ignored) {
113         }
114 
115         try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
116              ObjectOutputStream oos = new ObjectOutputStream(bos)) {
117             oos.writeObject(ds);
118             serialized = bos.toByteArray();
119         }
120 
121         DragSource ds_copy;
122         try (ByteArrayInputStream bis = new ByteArrayInputStream(serialized);
123              ObjectInputStream ois = new ObjectInputStream(bis)) {
124              ds_copy = (DragSource) ois.readObject();
125         }
126 
127         DragSourceListener[] dsls = ds_copy.getDragSourceListeners();
128         assertEquals(3, dsls.length, "DragSourceListeners number");
129         assertEquals(1, Stream.of(dsls).filter(dsa1::equals).collect(Collectors.counting()).intValue());
130         assertEquals(2, Stream.of(dsls).filter(dsa2::equals).collect(Collectors.counting()).intValue());
131 
132         DragSourceMotionListener[] dsmls = ds_copy.getDragSourceMotionListeners();
133         assertEquals(3, dsmls.length, "DragSourceMotionListeners number");
134         assertEquals(2, Stream.of(dsmls).filter(dsa1::equals).collect(Collectors.counting()).intValue());
135         assertEquals(1, Stream.of(dsmls).filter(dsa2::equals).collect(Collectors.counting()).intValue());
136     }
137 }
138 
139 class TestDragSourceAdapter extends DragSourceAdapter implements Serializable {
140     final int id;
141 
TestDragSourceAdapter(int id)142     TestDragSourceAdapter(int id) {
143         this.id = id;
144     }
145 
getId()146     public int getId() {
147         return id;
148     }
149 
equals(Object obj)150     public boolean equals(Object obj) {
151         if (obj instanceof TestDragSourceAdapter) {
152             TestDragSourceAdapter tdsa = (TestDragSourceAdapter) obj;
153             return tdsa.getId() == getId();
154         }
155         return false;
156     }
157 }
158