aboutsummaryrefslogtreecommitdiff
path: root/javaparser-core/src/main/java/com/github/javaparser/utils/SourceZip.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-core/src/main/java/com/github/javaparser/utils/SourceZip.java')
-rw-r--r--javaparser-core/src/main/java/com/github/javaparser/utils/SourceZip.java169
1 files changed, 169 insertions, 0 deletions
diff --git a/javaparser-core/src/main/java/com/github/javaparser/utils/SourceZip.java b/javaparser-core/src/main/java/com/github/javaparser/utils/SourceZip.java
new file mode 100644
index 000000000..ffb64f4a4
--- /dev/null
+++ b/javaparser-core/src/main/java/com/github/javaparser/utils/SourceZip.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
+ * Copyright (C) 2011, 2013-2016 The JavaParser Team.
+ *
+ * This file is part of JavaParser.
+ *
+ * JavaParser can be used either under the terms of
+ * a) the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * b) the terms of the Apache License
+ *
+ * You should have received a copy of both licenses in LICENCE.LGPL and
+ * LICENCE.APACHE. Please refer to those files for details.
+ *
+ * JavaParser is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ */
+
+package com.github.javaparser.utils;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseResult;
+import com.github.javaparser.ParserConfiguration;
+import com.github.javaparser.ast.CompilationUnit;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import static com.github.javaparser.ParseStart.COMPILATION_UNIT;
+import static com.github.javaparser.Providers.provider;
+import static com.github.javaparser.utils.Utils.assertNotNull;
+
+/**
+ * A collection of Java source files and its sub-directories located in a ZIP or JAR file on the file system.
+ * Files can be parsed with a callback.
+ *
+ */
+public class SourceZip {
+
+ private final Path zipPath;
+ private ParserConfiguration parserConfiguration;
+
+ /**
+ * Create a new ZIP parser. An instance of {@link JavaParser} with the default {@link ParserConfiguration} will be
+ * used to parse the ZIP.
+ *
+ * @param zipPath The absolute path of ZIP file to parse.
+ */
+ public SourceZip(Path zipPath) {
+ this(zipPath, new ParserConfiguration());
+ }
+
+ /**
+ * Create a new ZIP parser. An instance of {@link JavaParser} with the given configuration will be used to parse
+ * the ZIP.
+ *
+ * @param zipPath The absolute path of ZIP file to parse.
+ * @param configuration The configuration to initiate the default parser with.
+ */
+ public SourceZip(Path zipPath, ParserConfiguration configuration) {
+ assertNotNull(zipPath);
+ assertNotNull(configuration);
+ this.zipPath = zipPath.normalize();
+ this.parserConfiguration = configuration;
+ Log.info("New source zip at \"%s\"", this.zipPath);
+ }
+
+ /**
+ * Tries to parse all '.java' files in the ZIP located at this <i>SourceZip</i>'s path and returns the parse
+ * results in a list.
+ *
+ * @return A list of path-compilation unit pairs.
+ *
+ * @throws IOException If an error occurs while trying to parse the given source.
+ */
+ public List<Pair<Path, ParseResult<CompilationUnit>>> parse() throws IOException {
+ Log.info("Parsing zip at \"%s\"", zipPath);
+ List<Pair<Path, ParseResult<CompilationUnit>>> results = new ArrayList<>();
+ parse((path, result) -> results.add(new Pair<>(path, result)));
+ return results;
+ }
+
+ /**
+ * Tries to parse all '.java' files in the ZIP located at this <i>SourceZip</i>'s path and returns the parse
+ * results in a list.
+ *
+ * @return A list of path-compilation unit pairs.
+ *
+ * @throws IOException If an error occurs while trying to parse the given source.
+ */
+ public SourceZip parse(Callback callback) throws IOException {
+ Log.info("Parsing zip at \"%s\"", zipPath);
+ JavaParser javaParser = new JavaParser(parserConfiguration);
+ try (ZipFile zipFile = new ZipFile(zipPath.toFile())) {
+ for (ZipEntry entry : Collections.list(zipFile.entries())) {
+ if (!entry.isDirectory() && entry.getName().endsWith(".java")) {
+ Log.info("Parsing zip entry \"%s\"", entry.getName());
+ final ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT,
+ provider(zipFile.getInputStream(entry)));
+ callback.process(Paths.get(entry.getName()), result);
+ }
+ }
+ }
+ return this;
+ }
+
+ /**
+ * An interface to define a callback for each file that's parsed.
+ */
+ @FunctionalInterface
+ public interface Callback {
+
+ /**
+ * Process the given parse result.
+ *
+ * @param relativeZipEntryPath The relative path of the entry in the ZIP file that was parsed.
+ * @param result The parse result of file located at <i>absolutePath</i>.
+ */
+ void process(Path relativeZipEntryPath, ParseResult<CompilationUnit> result);
+ }
+
+ /**
+ * Get the path of the ZIP file to be parsed.
+ *
+ * @return The absolute path of this ZIP file.
+ */
+ public Path getZipPath() {
+ return zipPath;
+ }
+
+ /**
+ * @deprecated store ParserConfiguration now
+ */
+ @Deprecated
+ public JavaParser getJavaParser() {
+ return new JavaParser(parserConfiguration);
+ }
+
+ /**
+ * Set the parser that is used for parsing by default.
+ *
+ * @deprecated store ParserConfiguration now
+ */
+ @Deprecated
+ public SourceZip setJavaParser(JavaParser javaParser) {
+ assertNotNull(javaParser);
+ this.parserConfiguration = javaParser.getParserConfiguration();
+ return this;
+ }
+
+ public ParserConfiguration getParserConfiguration() {
+ return parserConfiguration;
+ }
+
+ public SourceZip setParserConfiguration(ParserConfiguration parserConfiguration) {
+ assertNotNull(parserConfiguration);
+ this.parserConfiguration = parserConfiguration;
+ return this;
+ }
+}