1/*
2 * Copyright (c) 2013, 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
24package sun.hotspot.tools.ctw;
25
26import java.io.IOException;
27import java.nio.file.DirectoryStream;
28import java.nio.file.Files;
29import java.nio.file.Path;
30import java.util.List;
31import java.util.Objects;
32import java.util.stream.Collectors;
33import java.util.stream.Stream;
34
35/**
36 * Handler for dirs containing jar-files with classes to compile.
37 */
38public class ClassPathJarInDirEntry {
39    public static List<PathHandler> create(Path path) {
40        Objects.requireNonNull(path);
41        if (!Files.exists(path)) {
42            throw new Error(path + " directory not found");
43        }
44        try {
45            return Stream.concat(
46                    Stream.of(new PathHandler(new JarInDirEntry(path))),
47                    Files.list(path)
48                         .filter(p -> p.getFileName().toString().endsWith(".jar"))
49                         .map(ClassPathJarEntry::new)
50                         .map(PathHandler::new))
51                         .collect(Collectors.toList());
52        } catch (IOException e) {
53            throw new Error("can not read " + path + " directory : " + e.getMessage(), e);
54        }
55    }
56
57    // dummy path handler, used just to print description before real handlers.
58    private static class JarInDirEntry extends PathHandler.PathEntry {
59        private JarInDirEntry(Path root) {
60            super(root);
61        }
62
63        @Override
64        protected byte[] findByteCode(String name) {
65            return null;
66        }
67
68        @Override
69        protected Stream<String> classes() {
70            return Stream.empty();
71        }
72
73        @Override
74        protected String description() {
75            return "# jar_in_dir: " + root;
76        }
77    }
78}
79
80