JavaParser Source Viewer

Home|JavaParser/com/github/javaparser/utils/SourceZip.java
1/*
2 * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
3 * Copyright (C) 2011, 2013-2020 The JavaParser Team.
4 *
5 * This file is part of JavaParser.
6 *
7 * JavaParser can be used either under the terms of
8 * a) the GNU Lesser General Public License as published by
9 *     the Free Software Foundation, either version 3 of the License, or
10 *     (at your option) any later version.
11 * b) the terms of the Apache License
12 *
13 * You should have received a copy of both licenses in LICENCE.LGPL and
14 * LICENCE.APACHE. Please refer to those files for details.
15 *
16 * JavaParser is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 * GNU Lesser General Public License for more details.
20 */
21
22package com.github.javaparser.utils;
23
24import com.github.javaparser.JavaParser;
25import com.github.javaparser.ParseResult;
26import com.github.javaparser.ParserConfiguration;
27import com.github.javaparser.ast.CompilationUnit;
28
29import java.io.IOException;
30import java.nio.file.Path;
31import java.nio.file.Paths;
32import java.util.ArrayList;
33import java.util.Collections;
34import java.util.List;
35import java.util.zip.ZipEntry;
36import java.util.zip.ZipFile;
37
38import static com.github.javaparser.ParseStart.COMPILATION_UNIT;
39import static com.github.javaparser.Providers.provider;
40import static com.github.javaparser.utils.Utils.assertNotNull;
41
42/**
43 * A collection of Java source files and its sub-directories located in a ZIP or JAR file on the file system.
44 * Files can be parsed with a callback.
45 *
46 */
47public class SourceZip {
48
49    private final Path zipPath;
50    private ParserConfiguration parserConfiguration;
51
52    /**
53     * Create a new ZIP parser. An instance of {@link JavaParser} with the default {@link ParserConfiguration} will be
54     * used to parse the ZIP.
55     *
56     * @param zipPath The absolute path of ZIP file to parse.
57     */
58    public SourceZip(Path zipPath) {
59        this(zipPath, new ParserConfiguration());
60    }
61
62    /**
63     * Create a new ZIP parser. An instance of {@link JavaParser} with the given configuration will be used to parse
64     * the ZIP.
65     *
66     * @param zipPath The absolute path of ZIP file to parse.
67     * @param configuration The configuration to initiate the default parser with.
68     */
69    public SourceZip(Path zipPathParserConfiguration configuration) {
70        assertNotNull(zipPath);
71        assertNotNull(configuration);
72        this.zipPath = zipPath.normalize();
73        this.parserConfiguration = configuration;
74        Log.info("New source zip at \"%s\"", ()->this.zipPath);
75    }
76
77    /**
78     * Tries to parse all '.java' files in the ZIP located at this <i>SourceZip</i>'s path and returns the parse
79     * results in a list.
80     *
81     * @return A list of path-compilation unit pairs.
82     *
83     * @throws IOException If an error occurs while trying to parse the given source.
84     */
85    public List<Pair<PathParseResult<CompilationUnit>>> parse() throws IOException {
86        Log.info("Parsing zip at \"%s\"", ()-> zipPath);
87        List<Pair<PathParseResult<CompilationUnit>>> results = new ArrayList<>();
88        parse((pathresult) -> results.add(new Pair<>(pathresult)));
89        return results;
90    }
91
92    /**
93     * Tries to parse all '.java' files in the ZIP located at this <i>SourceZip</i>'s path and returns the parse
94     * results in a list.
95     *
96     * @return A list of path-compilation unit pairs.
97     *
98     * @throws IOException If an error occurs while trying to parse the given source.
99     */
100    public SourceZip parse(Callback callback) throws IOException {
101        Log.info("Parsing zip at \"%s\"", ()-> zipPath);
102        JavaParser javaParser = new JavaParser(parserConfiguration);
103        try (ZipFile zipFile = new ZipFile(zipPath.toFile())) {
104            for (ZipEntry entry : Collections.list(zipFile.entries())) {
105                if (!entry.isDirectory() && entry.getName().endsWith(".java")) {
106                    Log.info("Parsing zip entry \"%s\"", ()-> entry.getName());
107                    final ParseResult<CompilationUnitresult = javaParser.parse(COMPILATION_UNIT,
108                            provider(zipFile.getInputStream(entry)));
109                    callback.process(Paths.get(entry.getName()), result);
110                }
111            }
112        }
113        return this;
114    }
115
116    /**
117     * An interface to define a callback for each file that's parsed.
118     */
119    @FunctionalInterface
120    public interface Callback {
121
122        /**
123         * Process the given parse result.
124         *
125         * @param relativeZipEntryPath The relative path of the entry in the ZIP file that was parsed.
126         * @param result The parse result of file located at <i>absolutePath</i>.
127         */
128        void process(Path relativeZipEntryPathParseResult<CompilationUnitresult);
129    }
130
131    /**
132     * Get the path of the ZIP file to be parsed.
133     *
134     * @return The absolute path of this ZIP file.
135     */
136    public Path getZipPath() {
137        return zipPath;
138    }
139    
140    public ParserConfiguration getParserConfiguration() {
141        return parserConfiguration;
142    }
143
144    public SourceZip setParserConfiguration(ParserConfiguration parserConfiguration) {
145        assertNotNull(parserConfiguration);
146        this.parserConfiguration = parserConfiguration;
147        return this;
148    }
149}
150
MembersX
SourceZip:zipPath
SourceZip:SourceZip
SourceZip:getZipPath
SourceZip:Callback:process
SourceZip:parse:Block:results
SourceZip:parserConfiguration
SourceZip:getParserConfiguration
SourceZip:parse:Block:Block:Block:Block:result
SourceZip:parse
SourceZip:parse:Block:javaParser
SourceZip:setParserConfiguration
Members
X