DragSourceListenerSerializationTest.java revision 14851:980da45565c8
1/*
2 * Copyright (c) 2014, 2016, 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  @key headful
27  @bug 4422345 8039083
28  @summary tests serialization of DragSourceListeners
29  @author das@sparc.spb.su area=dnd
30  @library ../../../../lib/testlibrary
31  @build jdk.testlibrary.Asserts
32  @run main/othervm DragSourceListenerSerializationTest
33*/
34
35import java.awt.Button;
36import java.awt.Component;
37import java.awt.Cursor;
38import java.awt.Point;
39import java.awt.Toolkit;
40import java.awt.datatransfer.StringSelection;
41import java.awt.dnd.DnDConstants;
42import java.awt.dnd.DragGestureEvent;
43import java.awt.dnd.DragGestureRecognizer;
44import java.awt.dnd.DragSource;
45import java.awt.dnd.DragSourceAdapter;
46import java.awt.dnd.DragSourceContext;
47import java.awt.dnd.DragSourceListener;
48import java.awt.dnd.DragSourceMotionListener;
49import java.awt.event.InputEvent;
50import java.awt.event.MouseEvent;
51import java.io.ByteArrayInputStream;
52import java.io.ByteArrayOutputStream;
53import java.io.ObjectInputStream;
54import java.io.ObjectOutputStream;
55import java.io.Serializable;
56import java.util.Arrays;
57import java.util.TooManyListenersException;
58import java.util.stream.Collectors;
59import java.util.stream.Stream;
60
61import static jdk.testlibrary.Asserts.assertEquals;
62
63public class DragSourceListenerSerializationTest {
64    public static void main(String[] args) throws Exception {
65        DragSource ds = new DragSource();
66        TestDragSourceAdapter dsa1 = new TestDragSourceAdapter(1);
67        TestDragSourceAdapter dsa2 = new TestDragSourceAdapter(2);
68        Component c = new Button();
69        DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer(c,
70                DnDConstants.ACTION_COPY,
71                e -> e.startDrag(null, null));
72        MouseEvent me = new MouseEvent(c, MouseEvent.MOUSE_PRESSED, 0,
73                InputEvent.CTRL_MASK, 100, 100, 0, false);
74        DragGestureEvent dge = new DragGestureEvent(dgr, DnDConstants.ACTION_COPY,
75                new Point(100, 100),
76                Arrays.asList(me));
77        DragSourceContext dsc = new DragSourceContext(
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
139class TestDragSourceAdapter extends DragSourceAdapter implements Serializable {
140    final int id;
141
142    TestDragSourceAdapter(int id) {
143        this.id = id;
144    }
145
146    public int getId() {
147        return id;
148    }
149
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