1 /*
2  * Copyright (c) 2015, 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  * @bug 8067747
27  * @summary Verify the correct Filer behavior w.r.t. initial inputs
28  *          (should throw FilerException when overwriting initial inputs).
29  * @library /tools/lib /tools/javac/lib
30  * @modules jdk.compiler/com.sun.tools.javac.api
31  *          jdk.compiler/com.sun.tools.javac.main
32  * @build toolbox.ToolBox toolbox.JavacTask toolbox.Task
33  * @build OverwriteInitialInput JavacTestingAbstractProcessor
34  * @run main OverwriteInitialInput
35  */
36 
37 import java.io.IOException;
38 import java.io.OutputStream;
39 import java.io.Writer;
40 import java.nio.file.Files;
41 import java.nio.file.Path;
42 import java.nio.file.Paths;
43 import java.util.Set;
44 
45 import javax.annotation.processing.FilerException;
46 import javax.annotation.processing.RoundEnvironment;
47 import javax.annotation.processing.SupportedOptions;
48 import javax.lang.model.element.TypeElement;
49 import javax.tools.StandardLocation;
50 
51 import toolbox.JavacTask;
52 import toolbox.Task;
53 import toolbox.ToolBox;
54 
55 @SupportedOptions({OverwriteInitialInput.EXPECT_EXCEPTION_OPTION,
56                    OverwriteInitialInput.TEST_SOURCE
57                   })
58 public class OverwriteInitialInput extends JavacTestingAbstractProcessor {
59 
60     public static final String EXPECT_EXCEPTION_OPTION = "exception";
61     public static final String TEST_SOURCE = "testSource";
62 
63     @Override
process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)64     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
65         if (roundEnv.processingOver()) {
66             if (processingEnv.getOptions().containsKey(EXPECT_EXCEPTION_OPTION)) {
67                 try (Writer w = processingEnv.getFiler().createSourceFile("Test").openWriter()) {
68                     throw new AssertionError("Expected IOException not seen.");
69                 } catch (FilerException ex) {
70                     //expected
71                 } catch (IOException ex) {
72                     throw new IllegalStateException(ex);
73                 }
74                 try (OutputStream out = processingEnv.getFiler().createClassFile("Test").openOutputStream()) {
75                     throw new AssertionError("Expected IOException not seen.");
76                 } catch (FilerException ex) {
77                     //expected
78                 } catch (IOException ex) {
79                     throw new IllegalStateException(ex);
80                 }
81                 if (processingEnv.getOptions().containsKey(TEST_SOURCE)) {
82                     try (OutputStream out = processingEnv.getFiler().createResource(StandardLocation.SOURCE_OUTPUT, "", "Test.java").openOutputStream()) {
83                         throw new AssertionError("Expected IOException not seen.");
84                     } catch (FilerException ex) {
85                         //expected
86                     } catch (IOException ex) {
87                         throw new IllegalStateException(ex);
88                     }
89                 } else {
90                     try (OutputStream out = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "Test2.class").openOutputStream()) {
91                         throw new AssertionError("Expected IOException not seen.");
92                     } catch (FilerException ex) {
93                         //expected
94                     } catch (IOException ex) {
95                         throw new IllegalStateException(ex);
96                     }
97                 }
98             } else {
99                 try (Writer w = processingEnv.getFiler().createSourceFile("Test").openWriter()) {
100                     w.append("public class Test {}");
101                 } catch (IOException ex) {
102                     throw new IllegalStateException(ex);
103                 }
104                 try (OutputStream out = processingEnv.getFiler().createClassFile("Test2").openOutputStream()) {
105                     try (ToolBox.MemoryFileManager mfm = new ToolBox.MemoryFileManager()) {
106                         ToolBox tb = new ToolBox();
107                         new JavacTask(tb)
108                           .sources("public class Test2 {}")
109                           .fileManager(mfm)
110                           .run()
111                           .writeAll();
112 
113                         out.write(mfm.getFileBytes(StandardLocation.CLASS_OUTPUT, "Test2"));
114                     }
115                 } catch (IOException ex) {
116                     throw new IllegalStateException(ex);
117                 }
118             }
119         }
120 
121         return false;
122     }
123 
main(String... args)124     public static void main(String... args) throws IOException {
125         new OverwriteInitialInput().run();
126     }
127 
run()128     void run() throws IOException {
129         run(Task.Mode.API);
130         run(Task.Mode.CMDLINE);
131     }
132 
run(Task.Mode mode)133     void run(Task.Mode mode) throws IOException {
134         ToolBox tb = new ToolBox();
135         Path path = Paths.get("output");
136         if (Files.isDirectory(path))
137             tb.cleanDirectory(path);
138         Files.deleteIfExists(path);
139         tb.createDirectories(path);
140         Path thisSource = Paths.get(System.getProperty("test.src"), "OverwriteInitialInput.java");
141         new JavacTask(tb, mode).options("-processor", "OverwriteInitialInput",
142                                         "-d", path.toString(),
143                                         "-XDaccessInternalAPI=true")
144                                .files(thisSource)
145                                .run()
146                                .writeAll();
147         new JavacTask(tb, mode).options("-processor", "OverwriteInitialInput",
148                                         "-d", path.toString(),
149                                         "-A" + EXPECT_EXCEPTION_OPTION,
150                                         "-A" + TEST_SOURCE,
151                                         "-XDaccessInternalAPI=true")
152                                .files(thisSource, path.resolve("Test.java"))
153                                .run()
154                                .writeAll();
155         new JavacTask(tb, mode).options("-processor", "OverwriteInitialInput",
156                                         "-classpath", path.toString(),
157                                         "-processorpath", System.getProperty("test.class.path"),
158                                         "-d", path.toString(),
159                                         "-A" + EXPECT_EXCEPTION_OPTION,
160                                         "-XDaccessInternalAPI=true")
161                                .classes("Test", "Test2")
162                                .run()
163                                .writeAll();
164     }
165 
166 }
167