1/*
2 * Copyright (c) 2015, 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 8067660
27 * @summary JFileChooser create new folder fails silently
28 * @requires (os.family == "windows")
29 * @run main/manual FileChooserTest
30 */
31import java.awt.Panel;
32import java.awt.TextArea;
33import java.awt.event.ActionEvent;
34import java.awt.event.ActionListener;
35import javax.swing.JButton;
36import javax.swing.JDialog;
37import javax.swing.JFileChooser;
38import javax.swing.JFrame;
39import javax.swing.SwingUtilities;
40
41public class FileChooserTest {
42
43    private static boolean theTestPassed;
44    private static boolean testGeneratedInterrupt;
45    private static Thread mainThread;
46    private static int sleepTime = 30000;
47    public static  JFileChooser fileChooser;
48
49    private static void init() throws Exception {
50
51        SwingUtilities.invokeAndWait(new Runnable() {
52            @Override
53            public void run() {
54                String[] instructions
55                        = {
56                            "1) Create a folder with read only permissions",
57                            "2) Click on run test button.It will open a open dialog"
58                            + " Navigate to the newly created read only folder",
59                            "3) Click on the create new folder button in open dialog",
60                            "4) If an error message does not pops up"
61                            + "test failed otherwise passed.",
62                            "5) Pressing Pass/Fail button will mark test as "
63                            + "pass/fail and will shutdown JVM"};
64
65                Sysout.createDialogWithInstructions(instructions);
66                Sysout.printInstructions(instructions);
67            }
68        });
69    }
70
71    /**
72     * ***************************************************
73     * Standard Test Machinery Section DO NOT modify anything in this section --
74     * it's a standard chunk of code which has all of the synchronisation
75     * necessary for the test harness. By keeping it the same in all tests, it
76     * is easier to read and understand someone else's test, as well as insuring
77     * that all tests behave correctly with the test harness. There is a section
78     * following this for test-defined classes
79     */
80    public static void main(String args[]) throws Exception {
81
82        mainThread = Thread.currentThread();
83        try {
84            init();
85        } catch (Exception ex) {
86            return;
87        }
88        try {
89            mainThread.sleep(sleepTime);
90        } catch (InterruptedException ex) {
91            Sysout.dispose();
92            if (!theTestPassed && testGeneratedInterrupt) {
93                throw new RuntimeException("Test Failed");
94            }
95        }
96        if (!testGeneratedInterrupt) {
97            Sysout.dispose();
98            throw new RuntimeException("Test Failed");
99        }
100    }
101
102    public static synchronized void pass() {
103        theTestPassed = true;
104        testGeneratedInterrupt = true;
105        mainThread.interrupt();
106    }
107
108    public static synchronized void fail() {
109        theTestPassed = false;
110        testGeneratedInterrupt = true;
111        mainThread.interrupt();
112    }
113}
114
115/**
116 * This is part of the standard test machinery. It creates a dialog (with the
117 * instructions), and is the interface for sending text messages to the user. To
118 * print the instructions, send an array of strings to Sysout.createDialog
119 * WithInstructions method. Put one line of instructions per array entry. To
120 * display a message for the tester to see, simply call Sysout.println with the
121 * string to be displayed. This mimics System.out.println but works within the
122 * test harness as well as standalone.
123 */
124class Sysout {
125
126    private static TestDialog dialog;
127    private static JFrame frame;
128
129    public static void createDialogWithInstructions(String[] instructions) {
130        frame = new JFrame();
131        dialog = new TestDialog(frame, "Instructions");
132        dialog.printInstructions(instructions);
133        dialog.setVisible(true);
134        println("Any messages for the tester will display here.");
135    }
136
137    public static void printInstructions(String[] instructions) {
138        dialog.printInstructions(instructions);
139    }
140
141    public static void println(String messageIn) {
142        dialog.displayMessage(messageIn);
143    }
144
145    public static void dispose() {
146        Sysout.println("Shutting down the Java process..");
147        if(FileChooserTest.fileChooser != null) {
148            FileChooserTest.fileChooser.cancelSelection();
149        }
150        frame.dispose();
151        dialog.dispose();
152    }
153}
154
155/**
156 * This is part of the standard test machinery. It provides a place for the test
157 * instructions to be displayed, and a place for interactive messages to the
158 * user to be displayed. To have the test instructions displayed, see Sysout. To
159 * have a message to the user be displayed, see Sysout. Do not call anything in
160 * this dialog directly.
161 */
162class TestDialog extends JDialog {
163
164    private TextArea instructionsText;
165    private TextArea messageText;
166    private int maxStringLength = 80;
167    private Panel buttonP = new Panel();
168    private JButton run = new JButton("Run");
169    private JButton passB = new JButton("Pass");
170    private JButton failB = new JButton("Fail");
171
172    public TestDialog(JFrame frame, String name) {
173        super(frame, name);
174        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
175        int scrollBoth = TextArea.SCROLLBARS_BOTH;
176        instructionsText = new TextArea("", 15, maxStringLength, scrollBoth);
177        add("North", instructionsText);
178
179        messageText = new TextArea("", 5, maxStringLength, scrollBoth);
180        add("Center", messageText);
181
182        buttonP.add("East", run);
183        buttonP.add("East", passB);
184        buttonP.add("West", failB);
185        passB.setEnabled(false);
186        failB.setEnabled(false);
187        add("South", buttonP);
188
189        run.addActionListener(new ActionListener() {
190
191            @Override
192            public void actionPerformed(ActionEvent ae) {
193                FileChooserTest.fileChooser = new JFileChooser();
194                FileChooserTest.fileChooser.showOpenDialog(null);
195                passB.setEnabled(true);
196                failB.setEnabled(true);
197            }
198        });
199
200        passB.addActionListener(new ActionListener() {
201
202            @Override
203            public void actionPerformed(ActionEvent ae) {
204                FileChooserTest.pass();
205            }
206        });
207
208        failB.addActionListener(new ActionListener() {
209
210            @Override
211            public void actionPerformed(ActionEvent ae) {
212                FileChooserTest.fail();
213            }
214        });
215        pack();
216
217        setVisible(true);
218    }
219
220    public void printInstructions(String[] instructions) {
221        instructionsText.setText("");
222
223        String printStr, remainingStr;
224        for (String instruction : instructions) {
225            remainingStr = instruction;
226            while (remainingStr.length() > 0) {
227                if (remainingStr.length() >= maxStringLength) {
228                    int posOfSpace = remainingStr.
229                            lastIndexOf(' ', maxStringLength - 1);
230
231                    if (posOfSpace <= 0) {
232                        posOfSpace = maxStringLength - 1;
233                    }
234
235                    printStr = remainingStr.substring(0, posOfSpace + 1);
236                    remainingStr = remainingStr.substring(posOfSpace + 1);
237                } else {
238                    printStr = remainingStr;
239                    remainingStr = "";
240                }
241                instructionsText.append(printStr + "\n");
242            }
243        }
244
245    }
246
247    public void displayMessage(String messageIn) {
248        messageText.append(messageIn + "\n");
249    }
250}
251