1/*
2 * Copyright (c) 2017, 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
24import java.awt.Container;
25import java.io.IOException;
26import java.net.URI;
27import java.nio.file.FileSystem;
28import java.nio.file.FileSystems;
29import java.nio.file.FileVisitResult;
30import java.nio.file.Files;
31import java.nio.file.Path;
32import java.nio.file.SimpleFileVisitor;
33import java.nio.file.attribute.BasicFileAttributes;
34
35import javax.swing.SwingContainer;
36
37/**
38 * @test
39 * @bug 8176177
40 */
41public final class SwingContainerIsForContainerOnly {
42
43    public static void main(String[] args) throws IOException {
44        FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
45        fs.getFileStores();
46        Files.walkFileTree(fs.getPath("/modules/java.desktop"), new SimpleFileVisitor<>() {
47            @Override
48            public FileVisitResult visitFile(Path file,
49                                             BasicFileAttributes attrs) {
50                file = file.subpath(2, file.getNameCount());
51                String name = file.toString();
52                if (name.endsWith(".class")) {
53                    name = name.substring(0, name.indexOf(".")).replace('/', '.');
54
55                    final Class<?> type;
56                    try {
57                        type = Class.forName(name, false, null);
58                    } catch (Throwable e) {
59                        return FileVisitResult.CONTINUE;
60                    }
61                    if (type.isAnnotationPresent(SwingContainer.class)) {
62                        if (!Container.class.isAssignableFrom(type)) {
63                            System.err.println("Wrong annotation for: " + type);
64                            throw new RuntimeException();
65                        }
66                    }
67                }
68                return FileVisitResult.CONTINUE;
69            };
70        });
71    }
72}
73