From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 289701384B4 for ; Fri, 6 Nov 2015 19:08:22 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id CB03F21C04D; Fri, 6 Nov 2015 19:08:19 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 2AA9921C04D for ; Fri, 6 Nov 2015 19:08:19 +0000 (UTC) Received: from oystercatcher.gentoo.org (unknown [IPv6:2a01:4f8:202:4333:225:90ff:fed9:fc84]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id EF30A340873 for ; Fri, 6 Nov 2015 19:08:16 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id D079A223C for ; Fri, 6 Nov 2015 19:08:12 +0000 (UTC) From: "Miroslav Šulc" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Miroslav Šulc" Message-ID: <1446836877.3c19012e3269319dfc022a7dc123d8e1d7dfe31c.fordfrog@gentoo> Subject: [gentoo-commits] proj/java-ebuilder:master commit in: src/main/java/org/gentoo/java/ebuilder/, src/main/resources/, ... X-VCS-Repository: proj/java-ebuilder X-VCS-Files: src/main/java/org/gentoo/java/ebuilder/Config.java src/main/java/org/gentoo/java/ebuilder/Main.java src/main/java/org/gentoo/java/ebuilder/maven/MavenDependency.java src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java src/main/resources/usage.txt X-VCS-Directories: src/main/java/org/gentoo/java/ebuilder/ src/main/java/org/gentoo/java/ebuilder/maven/ src/main/resources/ X-VCS-Committer: fordfrog X-VCS-Committer-Name: Miroslav Šulc X-VCS-Revision: 3c19012e3269319dfc022a7dc123d8e1d7dfe31c X-VCS-Branch: master Date: Fri, 6 Nov 2015 19:08:12 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 48e537b6-8791-4739-9aaf-4492dd0dd40a X-Archives-Hash: d289d16f5a503b5dc6191b933c1def2e commit: 3c19012e3269319dfc022a7dc123d8e1d7dfe31c Author: Miroslav Šulc fordfrog com> AuthorDate: Fri Nov 6 19:07:57 2015 +0000 Commit: Miroslav Šulc gentoo org> CommitDate: Fri Nov 6 19:07:57 2015 +0000 URL: https://gitweb.gentoo.org/proj/java-ebuilder.git/commit/?id=3c19012e rewritten to be able to support multiple pom files (the multiple pom files ebuild creation is not implemented yet) src/main/java/org/gentoo/java/ebuilder/Config.java | 33 +- src/main/java/org/gentoo/java/ebuilder/Main.java | 37 +- .../java/ebuilder/maven/MavenDependency.java | 111 ++++++ .../gentoo/java/ebuilder/maven/MavenEbuilder.java | 436 +++++++++++---------- .../gentoo/java/ebuilder/maven/MavenParser.java | 77 ++-- .../gentoo/java/ebuilder/maven/MavenProject.java | 137 ++----- src/main/resources/usage.txt | 3 +- 7 files changed, 476 insertions(+), 358 deletions(-) diff --git a/src/main/java/org/gentoo/java/ebuilder/Config.java b/src/main/java/org/gentoo/java/ebuilder/Config.java index 09fc4c7..557117a 100644 --- a/src/main/java/org/gentoo/java/ebuilder/Config.java +++ b/src/main/java/org/gentoo/java/ebuilder/Config.java @@ -4,6 +4,9 @@ import java.io.PrintWriter; import java.net.URI; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * Container for command line configuration. @@ -42,9 +45,9 @@ public class Config { */ private String license; /** - * Path to pom.xml file. + * List of paths to pom.xml files. */ - private Path pom; + private final List pomFiles = new ArrayList<>(10); /** * Path to portage tree. */ @@ -79,6 +82,15 @@ public class Config { } /** + * Adds pom file to {@link #pomFiles}. + * + * @param pomFile path to pom file + */ + public void addPomFile(final Path pomFile) { + pomFiles.add(pomFile); + } + + /** * Getter for {@link #cacheFile}. * * @return {@link #cacheFile} @@ -169,21 +181,12 @@ public class Config { } /** - * Getter for {@link #pom}. - * - * @return {@link #pom} - */ - public Path getPom() { - return pom; - } - - /** - * Setter for {@link #pom}. + * Getter for {@link #pomFiles}. * - * @param pom {@link #pom} + * @return {@link #pomFiles} */ - public void setPom(final Path pom) { - this.pom = pom; + public List getPomFiles() { + return Collections.unmodifiableList(pomFiles); } /** diff --git a/src/main/java/org/gentoo/java/ebuilder/Main.java b/src/main/java/org/gentoo/java/ebuilder/Main.java index c5d8998..5bf1490 100644 --- a/src/main/java/org/gentoo/java/ebuilder/Main.java +++ b/src/main/java/org/gentoo/java/ebuilder/Main.java @@ -1,12 +1,15 @@ package org.gentoo.java.ebuilder; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URI; import java.net.URISyntaxException; +import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import org.gentoo.java.ebuilder.maven.MavenCache; import org.gentoo.java.ebuilder.maven.MavenEbuilder; import org.gentoo.java.ebuilder.maven.MavenParser; @@ -99,18 +102,23 @@ public class Main { + config.getWorkdir().toFile().getPath() + " does not exist."); Runtime.getRuntime().exit(1); - } else if (config.getPom() == null) { + } else if (config.getPomFiles().isEmpty()) { config.getErrorWriter().println( - "ERROR: --pom must be specified."); - Runtime.getRuntime().exit(1); - } else if (!config.getWorkdir().resolve(config.getPom()). - toFile().exists()) { - config.getErrorWriter().println("ERROR: POM file " - + config.getWorkdir().resolve(config.getPom()) - + " does not exist."); + "ERROR: --pom must be specified at least once."); Runtime.getRuntime().exit(1); } + config.getPomFiles().stream().forEach((pomFile) -> { + final File fullPath + = config.getWorkdir().resolve(pomFile).toFile(); + + if (!fullPath.exists()) { + config.getErrorWriter().println("ERROR: POM file " + + fullPath + " does not exist."); + Runtime.getRuntime().exit(1); + } + }); + if (config.getSlot() == null) { config.setSlot("0"); } @@ -127,7 +135,7 @@ public class Main { } else if (config.getLicense() != null) { config.getErrorWriter().println("WARNING: License is used only " + "when generating ebuild."); - } else if (config.getPom() != null) { + } else if (!config.getPomFiles().isEmpty()) { config.getErrorWriter().println("WARNING: pom.xml is used only " + "when generating ebuild."); } else if (config.getSlot() != null) { @@ -152,14 +160,15 @@ public class Main { * @param config application configuration */ private static void generateEbuild(final Config config) { - final MavenParser mavenParser = new MavenParser(); - final MavenProject mavenProject = mavenParser.parsePom(config); - final MavenCache mavenCache = new MavenCache(); mavenCache.loadCache(config); + final MavenParser mavenParser = new MavenParser(); + final List mavenProjects + = mavenParser.parsePomFiles(config, mavenCache); + final MavenEbuilder mavenEbuilder = new MavenEbuilder(); - mavenEbuilder.generateEbuild(config, mavenProject, mavenCache); + mavenEbuilder.generateEbuild(config, mavenProjects, mavenCache); } /** @@ -209,7 +218,7 @@ public class Main { case "--pom": case "-p": i++; - config.setPom(Paths.get(args[i])); + config.addPomFile(Paths.get(args[i])); break; case "-portage-tree": case "-t": diff --git a/src/main/java/org/gentoo/java/ebuilder/maven/MavenDependency.java b/src/main/java/org/gentoo/java/ebuilder/maven/MavenDependency.java new file mode 100644 index 0000000..2760138 --- /dev/null +++ b/src/main/java/org/gentoo/java/ebuilder/maven/MavenDependency.java @@ -0,0 +1,111 @@ +package org.gentoo.java.ebuilder.maven; + +import org.gentoo.java.ebuilder.portage.MavenVersion; + +/** + * Maven project dependency. + * + * @author fordfrog + */ +public class MavenDependency { + + /** + * Artifact id. + */ + private final String artifactId; + /** + * Group id. + */ + private final String groupId; + /** + * Parsed maven version. + */ + private final MavenVersion mavenVersion; + /** + * Dependency scope. + */ + private final String scope; + /** + * System dependency. + */ + private final String systemDependency; + /** + * Version. + */ + private final String version; + + /** + * Creates new instance of Dependency. + * + * @param groupId {@link #groupId}. + * @param artifactId {@link #artifactId} + * @param version {@link #version} + * @param scope {@link #scope} + * @param systemDependency {@link #systemDependency} + */ + public MavenDependency(final String groupId, final String artifactId, + final String version, final String scope, + final String systemDependency) { + this.groupId = groupId; + this.artifactId = artifactId; + this.version = version; + this.scope = scope; + this.systemDependency = systemDependency; + mavenVersion = new MavenVersion(version); + } + + /** + * Getter for {@link #artifactId}. + * + * @return {@link #artifactId} + */ + public String getArtifactId() { + return artifactId; + } + + /** + * Getter for {@link #groupId}. + * + * @return {@link #groupId} + */ + public String getGroupId() { + return groupId; + } + + /** + * Getter for {@link #mavenVersion}. + * + * @return {@link #mavenVersion} + */ + public MavenVersion getMavenVersion() { + return mavenVersion; + } + + /** + * Getter for {@link #scope}. + * + * @return {@link #scope} + */ + public String getScope() { + return scope; + } + + /** + * Getter for {@link #systemDependency}. + * + * @return {@link #systemDependency} + */ + public String getSystemDependency() { + return systemDependency; + } + + /** + * Getter for {@link #version}. + * + * @return {@link #version} + */ + public String getVersion() { + return version; + } + +} diff --git a/src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java b/src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java index 76a27a8..f717d9b 100644 --- a/src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java +++ b/src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java @@ -24,11 +24,12 @@ public class MavenEbuilder { /** * Generates ebuild from the collected information at the specified path. * - * @param config application configuration - * @param mavenProject maven project information - * @param mavenCache populated maven cache + * @param config application configuration + * @param mavenProjects list of maven project information + * @param mavenCache populated maven cache */ - public void generateEbuild(final Config config, MavenProject mavenProject, + public void generateEbuild(final Config config, + final List mavenProjects, final MavenCache mavenCache) { config.getStdoutWriter().print("Writing ebuild..."); @@ -38,28 +39,14 @@ public class MavenEbuilder { writeCommand(config, writer); writeEAPI(writer); writeInherit(writer); - writePackageInfo(config, mavenProject, writer); - - final List commonDependencies - = resolveDependencies(mavenProject.getCommonDependencies(), - mavenCache); - final List testDependencies - = resolveDependencies(mavenProject.getTestDependencies(), - mavenCache); - final List compileDependencies - = resolveDependencies(mavenProject.getCompileDependencies(), - mavenCache); - final List runtimeDependencies - = resolveDependencies(mavenProject.getRuntimeDependencies(), - mavenCache); - - writeDependencies(config, mavenProject, commonDependencies, - testDependencies, compileDependencies, runtimeDependencies, - writer); + // write the info from the last project as it is probably the one + // that depends on the rest + writePackageInfo(config, + mavenProjects.get(mavenProjects.size() - 1), writer); + + writeDependencies(config, mavenProjects, writer); writeSourceDir(writer); - writeScript(config, mavenProject, commonDependencies, - testDependencies, compileDependencies, runtimeDependencies, - writer); + writeScript(config, mavenProjects, writer); } catch (final IOException ex) { throw new RuntimeException("Failed to write ebuild", ex); } @@ -74,12 +61,13 @@ public class MavenEbuilder { * * @return classpath */ - private String createClassPath(final List dependencies) { + private String createClassPath( + final List dependencies) { final StringBuilder sbCP = new StringBuilder(dependencies.size() * 15); - dependencies.stream().filter((final ResolvedDependency dependency) + dependencies.stream().filter((dependency) -> dependency.getSystemDependency() != null). - forEach((final ResolvedDependency dependency) -> { + forEach((dependency) -> { if (sbCP.length() > 0) { sbCP.append(','); } @@ -94,31 +82,45 @@ public class MavenEbuilder { } /** - * Determines the testing framework. + * Determines the testing framework based on project dependencies. * - * @param testDepenencies list of test dependencies - * @param commonDependencies list of common dependencies + * @param mavenProjects list of maven projects * * @return testing framework name or null */ private String determineTestingFramework( - final List testDepenencies, - final List commonDependencies) { - final List dependencies = new ArrayList<>( - testDepenencies.size() + commonDependencies.size()); - dependencies.addAll(testDepenencies); - dependencies.addAll(commonDependencies); - - for (final ResolvedDependency dependency : dependencies) { - final MavenProject.Dependency mavenDependency - = dependency.getMavenDependency(); - - if (mavenDependency.getGroupId() == null) { - continue; + final List mavenProjects) { + for (final MavenProject mavenProject : mavenProjects) { + final String result = determineTestingFramework(mavenProject); + + if (result != null) { + return result; + } + } + + return null; + } + + /** + * Determines the testing framework based on project dependencies. + * + * @param mavenProject maven project + * + * @return testing framework name or null + */ + private String determineTestingFramework(final MavenProject mavenProject) { + for (final MavenDependency dependency : mavenProject. + getTestDependencies()) { + if ("junit".equals(dependency.getGroupId()) + && "junit".equals(dependency.getArtifactId())) { + return "junit"; } + } - if ("junit".equals(mavenDependency.getGroupId()) - && "junit".equals(mavenDependency.getArtifactId())) { + for (final MavenDependency dependency : mavenProject. + getCommonDependencies()) { + if ("junit".equals(dependency.getGroupId()) + && "junit".equals(dependency.getArtifactId())) { return "junit"; } } @@ -127,49 +129,93 @@ public class MavenEbuilder { } /** - * Attempts to resolve dependencies using the specified cache. + * Retrieves minimum source version from the maven projects. * - * @param dependencies list of maven dependencies - * @param mavenCache maven cache + * @param mavenProjects list of maven projects * - * @return list of resolved dependencies (system dependency can be null) + * @return minimum source version */ - private List resolveDependencies( - final List dependencies, - final MavenCache mavenCache) { - final List result - = new ArrayList<>(dependencies.size()); + private String getMinSourceVersion(final List mavenProjects) { + String result = null; - dependencies.stream().forEach((dependency) -> { - result.add(new ResolvedDependency(dependency, - mavenCache.getDependency(dependency.getGroupId(), - dependency.getArtifactId(), - dependency.getVersion()))); - }); + for (final MavenProject mavenProject : mavenProjects) { + if (result == null || mavenProject.getSourceVersion().compareTo( + result) < 0) { + result = mavenProject.getSourceVersion(); + } + } return result; } /** - * Sorts dependencies using system dependency. + * Retrieves minimum target version from the maven projects. * - * @param dependencies list of dependencies + * @param mavenProjects list of maven projects + * + * @return minimum target version + */ + private String getMinTargetVersion(final List mavenProjects) { + String result = null; + + for (final MavenProject mavenProject : mavenProjects) { + if (result == null || mavenProject.getTargetVersion().compareTo( + result) < 0) { + result = mavenProject.getTargetVersion(); + } + } + + return result; + } + + /** + * Merges maven project system dependencies of specified type and removed + * duplicates. + * + * @param mavenProjects list of maven projects + * @param type type of dependencies ("common", "compile", "runtime" + * and "test") + * + * @return list of merged dependencies */ - private void sortDependencies(final List dependencies) { - dependencies.sort((final ResolvedDependency o1, - final ResolvedDependency o2) -> { - if (o1.getSystemDependency() == null - && o2.getSystemDependency() == null) { - return 0; - } else if (o1.getSystemDependency() == null) { - return 1; - } else if (o2.getSystemDependency() == null) { - return -1; - } else { - return o1.getSystemDependency().compareTo( - o2.getSystemDependency()); + private List mergeSystemDependencies( + final List mavenProjects, final String type) { + final List result = new ArrayList<>(30); + + mavenProjects.stream().forEach((mavenProject) -> { + final List dependencies; + + switch (type) { + case "common": + dependencies = mavenProject.getCommonDependencies(); + break; + case "compile": + dependencies = mavenProject.getCompileDependencies(); + break; + case "runtime": + dependencies = mavenProject.getRuntimeDependencies(); + break; + case "test": + dependencies = mavenProject.getTestDependencies(); + break; + default: + throw new RuntimeException( + "Dependencies type not supported: " + type); } + + dependencies.stream().filter((dependency) + -> (dependency.getSystemDependency() != null + && !result.contains(dependency.getSystemDependency()))). + forEach((dependency) -> { + result.add(dependency.getSystemDependency()); + }); + }); + + result.sort((final String o1, final String o2) -> { + return o1.compareTo(o2); }); + + return result; } /** @@ -183,9 +229,11 @@ public class MavenEbuilder { writer.println("# Skeleton command:"); writer.print("# java-ebuilder --generate-ebuild --workdir ."); - if (config.getPom() != null) { - writer.print(" --pom "); - writer.print(config.getPom()); + if (!config.getPomFiles().isEmpty()) { + config.getPomFiles().stream().forEach((pomFile) -> { + writer.print(" --pom "); + writer.print(pomFile); + }); } if (config.getDownloadUri() != null) { @@ -220,65 +268,67 @@ public class MavenEbuilder { /** * Writes dependencies to the ebuild. * - * @param config application configuration - * @param mavenProject maven project instance - * @param commonDependencies common dependencies - * @param testDependencies test dependencies - * @param compileDependencies compile dependencies - * @param runtimeDependencies runtime dependencies - * @param writer ebuild writer + * @param config application configuration + * @param mavenProjects list of maven projects + * @param writer ebuild writer */ private void writeDependencies(final Config config, - final MavenProject mavenProject, - final List commonDependencies, - final List testDependencies, - final List compileDependencies, - final List runtimeDependencies, + final List mavenProjects, final PrintWriter writer) { - boolean hasCDepend = false; - - if (!commonDependencies.isEmpty() || !testDependencies.isEmpty()) { - hasCDepend = true; + final List commonDependencies = mergeSystemDependencies( + mavenProjects, "common"); + final List testDependencies = mergeSystemDependencies( + mavenProjects, "test"); + final List compileDependencies = mergeSystemDependencies( + mavenProjects, "compile"); + final List runtimeDependencies = mergeSystemDependencies( + mavenProjects, "runtime"); + boolean hasCDepend = !commonDependencies.isEmpty() + || !testDependencies.isEmpty(); + if (hasCDepend) { writer.println(); writer.println("# Common dependencies"); - if (!commonDependencies.isEmpty()) { - writeDependenciesInfo(writer, commonDependencies, null); - } + for (final MavenProject mavenProject : mavenProjects) { + if (mavenProject.getCommonDependencies().isEmpty() + && mavenProject.getTestDependencies().isEmpty()) { + continue; + } - if (!testDependencies.isEmpty()) { - writeDependenciesInfo(writer, testDependencies, "test?"); + if (!mavenProject.getCommonDependencies().isEmpty()) { + writeDependenciesInfo(writer, mavenProject.getPomFile(), + mavenProject.getCommonDependencies(), null); + } + + if (!mavenProject.getTargetVersion().isEmpty()) { + writeDependenciesInfo(writer, mavenProject.getPomFile(), + mavenProject.getTestDependencies(), "test?"); + } + + hasCDepend = true; } writer.print("CDEPEND=\""); if (!commonDependencies.isEmpty()) { - sortDependencies(commonDependencies); - commonDependencies.stream(). - filter((final ResolvedDependency dependency) - -> dependency.getSystemDependency() != null). - forEach((final ResolvedDependency dependency) -> { + forEach((dependency) -> { writer.println(); writer.print('\t'); - writer.print(dependency.getSystemDependency()); + writer.print(dependency); }); } if (!testDependencies.isEmpty()) { - sortDependencies(testDependencies); - writer.println(); writer.println("\ttest? ("); testDependencies.stream(). - filter((final ResolvedDependency dependency) - -> dependency.getSystemDependency() != null). - forEach((final ResolvedDependency dependency) -> { + forEach((dependency) -> { writer.println(); writer.print("\t\t"); - writer.print(dependency.getSystemDependency()); + writer.print(dependency); }); writer.print("\t)"); @@ -289,7 +339,13 @@ public class MavenEbuilder { if (!compileDependencies.isEmpty()) { writer.println("# Compile dependencies"); - writeDependenciesInfo(writer, compileDependencies, null); + + mavenProjects.stream().filter((mavenProject) -> (!mavenProject. + getCompileDependencies().isEmpty())) + .forEach((mavenProject) -> { + writeDependenciesInfo(writer, mavenProject.getPomFile(), + mavenProject.getCompileDependencies(), null); + }); } else { writer.println(); } @@ -302,7 +358,7 @@ public class MavenEbuilder { writer.println(); writer.print("\t>=virtual/jdk-"); - writer.print(mavenProject.getSourceVersion()); + writer.print(getMinSourceVersion(mavenProjects)); if (config.getDownloadUri() != null && config.getDownloadUri(). toString().matches("^.*?\\.(jar|zip)$")) { @@ -312,12 +368,10 @@ public class MavenEbuilder { if (!compileDependencies.isEmpty()) { compileDependencies.stream(). - filter((final ResolvedDependency dependency) - -> dependency.getSystemDependency() != null). - forEach((final ResolvedDependency dependency) -> { + forEach((dependency) -> { writer.println(); writer.print('\t'); - writer.print(dependency.getSystemDependency()); + writer.print(dependency); }); } @@ -325,7 +379,13 @@ public class MavenEbuilder { if (!runtimeDependencies.isEmpty()) { writer.println("# Runtime dependencies"); - writeDependenciesInfo(writer, runtimeDependencies, null); + + mavenProjects.stream().filter((mavenProject) -> (!mavenProject. + getRuntimeDependencies().isEmpty())) + .forEach((mavenProject) -> { + writeDependenciesInfo(writer, mavenProject.getPomFile(), + mavenProject.getRuntimeDependencies(), null); + }); } else { writer.println(); } @@ -338,16 +398,14 @@ public class MavenEbuilder { writer.println(); writer.print("\t>=virtual/jre-"); - writer.print(mavenProject.getTargetVersion()); + writer.print(getMinTargetVersion(mavenProjects)); if (!runtimeDependencies.isEmpty()) { runtimeDependencies.stream(). - filter((final ResolvedDependency dependency) - -> dependency.getSystemDependency() != null). - forEach((final ResolvedDependency dependency) -> { + forEach((dependency) -> { writer.println(); writer.print('\t'); - writer.print(dependency.getSystemDependency()); + writer.print(dependency); }); } @@ -358,12 +416,17 @@ public class MavenEbuilder { * Writes dependencies information to the ebuild. * * @param writer ebuild writer + * @param pomFile path to pom file * @param dependencies list of dependencies * @param useFlag optional USE flag including question mark */ private void writeDependenciesInfo(final PrintWriter writer, - final List dependencies, final String useFlag) { - dependencies.stream().forEach((ResolvedDependency dependency) -> { + final Path pomFile, final List dependencies, + final String useFlag) { + writer.print("# POM: "); + writer.println(pomFile); + + dependencies.stream().forEach((dependency) -> { writer.print("# "); if (useFlag != null) { @@ -371,11 +434,11 @@ public class MavenEbuilder { writer.print(' '); } - writer.print(dependency.getMavenDependency().getGroupId()); + writer.print(dependency.getGroupId()); writer.print(':'); - writer.print(dependency.getMavenDependency().getArtifactId()); + writer.print(dependency.getArtifactId()); writer.print(':'); - writer.print(dependency.getMavenDependency().getVersion()); + writer.print(dependency.getVersion()); writer.print(" -> "); writer.println(dependency.getSystemDependency()); }); @@ -416,6 +479,19 @@ public class MavenEbuilder { } /** + * Writes ebuild script for multiple projects. + * + * @param config application configuration + * @param mavenProjects list of maven projects + * @param writer ebuild writer + */ + private void writeMultipleProjectsScript(final Config config, + final List mavenProjects, final PrintWriter writer) { + // TODO: implement multiple-project script + throw new UnsupportedOperationException("Not implemented yet."); + } + + /** * Writes package information. * * @param config application configuration @@ -482,49 +558,58 @@ public class MavenEbuilder { /** * Writes ebuild script. * - * @param config application configuration - * @param mavenProject maven project instance - * @param commonDependencies common dependencies - * @param testDependencies test dependencies - * @param compileDependencies compile dependencies - * @param runtimeDependencies runtime dependencies - * @param writer ebuild writer + * @param config application configuration + * @param mavenProjects list of maven projects + * @param writer ebuild writer */ private void writeScript(final Config config, - final MavenProject mavenProject, - final List commonDependencies, - final List testDependencies, - final List compileDependencies, - final List runtimeDependencies, + final List mavenProjects, final PrintWriter writer) { + if (mavenProjects.size() == 1) { + writeSingleProjectScript(config, mavenProjects.get(0), writer); + } else { + writeMultipleProjectsScript(config, mavenProjects, writer); + } + } + + /** + * Writes ebuild script for single project. + * + * @param config application configuration + * @param mavenProject maven project + * @param writer ebuild writer + */ + private void writeSingleProjectScript(final Config config, + final MavenProject mavenProject, final PrintWriter writer) { writer.println(); - if (!commonDependencies.isEmpty() || !runtimeDependencies.isEmpty()) { - final List dependencies - = new ArrayList<>(commonDependencies.size() - + runtimeDependencies.size()); - dependencies.addAll(commonDependencies); - dependencies.addAll(runtimeDependencies); + if (!mavenProject.getCommonDependencies().isEmpty() + || !mavenProject.getRuntimeDependencies().isEmpty()) { + final List dependencies + = new ArrayList<>( + mavenProject.getCommonDependencies().size() + + mavenProject.getRuntimeDependencies().size()); + dependencies.addAll(mavenProject.getCommonDependencies()); + dependencies.addAll(mavenProject.getRuntimeDependencies()); writer.print("JAVA_GENTOO_CLASSPATH=\""); writer.print(createClassPath(dependencies)); writer.println('"'); } - if (!compileDependencies.isEmpty()) { + if (!mavenProject.getCompileDependencies().isEmpty()) { writer.print("JAVA_CLASSPATH_EXTRA=\""); - writer.print(createClassPath(compileDependencies)); + writer.print(createClassPath(mavenProject.getCompileDependencies())); writer.println('"'); } - if (!testDependencies.isEmpty()) { + if (!mavenProject.getTestDependencies().isEmpty()) { writer.print("JAVA_GENTOO_TEST_CLASSPATH=\""); - writer.print(createClassPath(testDependencies)); + writer.print(createClassPath(mavenProject.getTestDependencies())); writer.println('"'); } - final String testingFramework = determineTestingFramework( - testDependencies, commonDependencies); + final String testingFramework = determineTestingFramework(mavenProject); if (testingFramework != null) { writer.print("JAVA_TESTING_FRAMEWORK=\""); @@ -603,49 +688,4 @@ public class MavenEbuilder { writer.println(); writer.println("S=\"${WORKDIR}\""); } - - /** - * Container for resolved dependency information. - */ - private static class ResolvedDependency { - - /** - * Maven dependency. - */ - private final MavenProject.Dependency mavenDependency; - /** - * System dependency. - */ - private final String systemDependency; - - /** - * Creates new instance of ResolvedDependency. - * - * @param mavenDependency {@link #mavenDependency} - * @param systemDependency {@link #systemDependency} - */ - ResolvedDependency(final MavenProject.Dependency mavenDependency, - final String systemDependency) { - this.mavenDependency = mavenDependency; - this.systemDependency = systemDependency; - } - - /** - * Getter for {@link #mavenDependency}. - * - * @return {@link #mavenDependency} - */ - public MavenProject.Dependency getMavenDependency() { - return mavenDependency; - } - - /** - * Getter for {@link #systemDependency}. - * - * @return {@link #systemDependency} - */ - public String getSystemDependency() { - return systemDependency; - } - } } diff --git a/src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java b/src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java index 5f95d6d..d8e4b48 100644 --- a/src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java +++ b/src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java @@ -6,7 +6,10 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; +import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLInputFactory; @@ -22,24 +25,33 @@ import org.gentoo.java.ebuilder.Config; public class MavenParser { /** - * Parses specified pom.xml. + * Parses specified pom.xml files. * - * @param config application configuration + * @param config application configuration + * @param mavenCache maven cache * - * @return + * @return list of maven projects */ - public MavenProject parsePom(final Config config) { - final File effectivePom = getEffectivePom(config); - - final MavenProject mavenProject = parsePom(config, effectivePom); - - if (mavenProject.hasTests() - && mavenProject.getTestDependencies().isEmpty()) { - mavenProject.addDependency(new MavenProject.Dependency( - "junit", "junit", "4.11", "test")); - } + public List parsePomFiles(final Config config, + final MavenCache mavenCache) { + final List result + = new ArrayList<>(config.getPomFiles().size()); + + config.getPomFiles().stream().forEach((pomFile) -> { + final File effectivePom = getEffectivePom(config, pomFile); + + final MavenProject mavenProject = parsePom(config, mavenCache, + pomFile, effectivePom); + + if (mavenProject.hasTests() + && mavenProject.getTestDependencies().isEmpty()) { + mavenProject.addDependency(new MavenDependency( + "junit", "junit", "4.11", "test", + mavenCache.getDependency("junit", "junit", "4.11"))); + } + }); - return mavenProject; + return result; } /** @@ -66,11 +78,12 @@ public class MavenParser { /** * Stores effective pom to file and returns the file. * - * @param config application configuration + * @param config application configuration + * @param pomFile path to pom.xml file that should be processed * * @return path to effective pom */ - private File getEffectivePom(final Config config) { + private File getEffectivePom(final Config config, final Path pomFile) { final File outputPath; try { @@ -81,10 +94,10 @@ public class MavenParser { } config.getStdoutWriter().print("Retrieving effective pom for " - + config.getPom() + " into " + outputPath + "..."); + + pomFile + " into " + outputPath + "..."); final ProcessBuilder processBuilder = new ProcessBuilder("mvn", "-f", - config.getPom().toString(), "help:effective-pom", + pomFile.toString(), "help:effective-pom", "-Doutput=" + outputPath); processBuilder.directory(config.getWorkdir().toFile()); @@ -305,11 +318,14 @@ public class MavenParser { * collected information. * * @param config application configuration + * @param mavenCache maven cache + * @param pomFile path to pom.xml file * @param effectivePom path to effective pom * * @return maven project instance */ private MavenProject parsePom(final Config config, + final MavenCache mavenCache, final Path pomFile, final File effectivePom) { config.getStdoutWriter().print("Parsing effective pom..."); @@ -323,7 +339,7 @@ public class MavenParser { throw new RuntimeException("Failed to read effective pom", ex); } - final MavenProject mavenProject = new MavenProject(); + final MavenProject mavenProject = new MavenProject(pomFile); try { while (reader.hasNext()) { @@ -332,7 +348,7 @@ public class MavenParser { if (reader.isStartElement()) { switch (reader.getLocalName()) { case "project": - parseProject(mavenProject, reader); + parseProject(mavenProject, mavenCache, reader); break; default: consumeElement(reader); @@ -358,7 +374,8 @@ public class MavenParser { * stream. */ private void parseProject(final MavenProject mavenProject, - final XMLStreamReader reader) throws XMLStreamException { + final MavenCache mavenCache, final XMLStreamReader reader) + throws XMLStreamException { while (reader.hasNext()) { reader.next(); @@ -371,7 +388,8 @@ public class MavenParser { parseProjectBuild(mavenProject, reader); break; case "dependencies": - parseProjectDependencies(mavenProject, reader); + parseProjectDependencies(mavenProject, mavenCache, + reader); break; case "description": mavenProject.setDescription(reader.getElementText()); @@ -444,20 +462,22 @@ public class MavenParser { * Parses project dependencies and its sub-elements. * * @param mavenProject maven project instance + * @param mavenCache maven cache * @param reader XML stream reader * * @throws XMLStreamException Thrown if problem occurred while reading XML * stream. */ private void parseProjectDependencies(final MavenProject mavenProject, - final XMLStreamReader reader) throws XMLStreamException { + final MavenCache mavenCache, final XMLStreamReader reader) + throws XMLStreamException { while (reader.hasNext()) { reader.next(); if (reader.isStartElement()) { switch (reader.getLocalName()) { case "dependency": - parseProjectDependency(mavenProject, reader); + parseProjectDependency(mavenProject, mavenCache, reader); break; default: consumeElement(reader); @@ -472,13 +492,15 @@ public class MavenParser { * Parses project dependency. * * @param mavenProject maven project instance + * @param mavenCache maven cache * @param reader XML stream reader * * @throws XMLStreamException Thrown if problem occurred while reading XML * stream. */ private void parseProjectDependency(final MavenProject mavenProject, - final XMLStreamReader reader) throws XMLStreamException { + final MavenCache mavenCache, final XMLStreamReader reader) + throws XMLStreamException { String groupId = null; String artifactId = null; String version = null; @@ -506,8 +528,9 @@ public class MavenParser { consumeElement(reader); } } else if (reader.isEndElement()) { - mavenProject.addDependency(new MavenProject.Dependency(groupId, - artifactId, version, scope)); + mavenProject.addDependency(new MavenDependency(groupId, + artifactId, version, scope, mavenCache.getDependency( + groupId, artifactId, version))); return; } diff --git a/src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java b/src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java index 77b5417..adec6a6 100644 --- a/src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java +++ b/src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java @@ -4,7 +4,6 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.gentoo.java.ebuilder.portage.MavenVersion; /** * Contains information about maven project collected from pom.xml. @@ -20,7 +19,7 @@ public class MavenProject { /** * List of project dependencies. */ - private final List dependencies = new ArrayList<>(10); + private final List dependencies = new ArrayList<>(10); /** * Project description. */ @@ -50,6 +49,10 @@ public class MavenProject { */ private String mainClass; /** + * Path to pom.xml file. + */ + private final Path pomFile; + /** * List of resource directories. */ private final List resourceDirectories = new ArrayList<>(10); @@ -83,11 +86,20 @@ public class MavenProject { private String version; /** + * Creates new instance of MavenProject. + * + * @param pomFile {@link #pomFile} + */ + public MavenProject(final Path pomFile) { + this.pomFile = pomFile; + } + + /** * Adds dependency to {@link #dependencies}. * * @param dependency {@link #dependencies} */ - public void addDependency(final Dependency dependency) { + public void addDependency(final MavenDependency dependency) { dependencies.add(dependency); } @@ -133,7 +145,7 @@ public class MavenProject { * * @return list of dependencies */ - public List getCommonDependencies() { + public List getCommonDependencies() { return getDependencies(new String[]{"compile"}); } @@ -142,7 +154,7 @@ public class MavenProject { * * @return list of dependencies */ - public List getCompileDependencies() { + public List getCompileDependencies() { return getDependencies(new String[]{"provided", "system"}); } @@ -151,7 +163,7 @@ public class MavenProject { * * @return {@link #dependencies} */ - public List getDependencies() { + public List getDependencies() { return Collections.unmodifiableList(dependencies); } @@ -228,6 +240,15 @@ public class MavenProject { } /** + * Getter for {@link #pomFile}. + * + * @return {@link #pomFile} + */ + public Path getPomFile() { + return pomFile; + } + + /** * Getter for {@link #resourceDirectories}. The list is read-only. * * @return {@link #resourceDirectories} @@ -241,7 +262,7 @@ public class MavenProject { * * @return list of dependencies */ - public List getRuntimeDependencies() { + public List getRuntimeDependencies() { return getDependencies(new String[]{"runtime"}); } @@ -324,7 +345,7 @@ public class MavenProject { * @return list of dependencies */ @SuppressWarnings("unchecked") - public List getTestDependencies() { + public List getTestDependencies() { if (!hasTests()) { return Collections.EMPTY_LIST; } @@ -443,10 +464,11 @@ public class MavenProject { * * @return list of dependencies */ - private List getDependencies(final String[] scopes) { - final List result = new ArrayList<>(dependencies.size()); + private List getDependencies(final String[] scopes) { + final List result + = new ArrayList<>(dependencies.size()); - for (final Dependency dependency : dependencies) { + for (final MavenDependency dependency : dependencies) { for (final String scope : scopes) { if (dependency.getScope().equals(scope)) { result.add(dependency); @@ -456,7 +478,7 @@ public class MavenProject { } } - result.sort((final Dependency o1, final Dependency o2) -> { + result.sort((final MavenDependency o1, final MavenDependency o2) -> { if (!o1.getGroupId().equals(o2.getGroupId())) { return o1.getGroupId().compareTo(o2.getGroupId()); } else { @@ -466,95 +488,4 @@ public class MavenProject { return result; } - - /** - * Maven project dependency. - */ - @SuppressWarnings("PublicInnerClass") - public static class Dependency { - - /** - * Artifact id. - */ - private final String artifactId; - /** - * Group id. - */ - private final String groupId; - /** - * Parsed maven version. - */ - private final MavenVersion mavenVersion; - /** - * Dependency scope. - */ - private final String scope; - /** - * Version. - */ - private final String version; - - /** - * Creates new instance of Dependency. - * - * @param groupId {@link #groupId}. - * @param artifactId {@link #artifactId} - * @param version {@link #version} - * @param scope {@link #scope} - */ - public Dependency(final String groupId, final String artifactId, - final String version, final String scope) { - this.groupId = groupId; - this.artifactId = artifactId; - this.version = version; - this.scope = scope; - - mavenVersion = new MavenVersion(version); - } - - /** - * Getter for {@link #artifactId}. - * - * @return {@link #artifactId} - */ - public String getArtifactId() { - return artifactId; - } - - /** - * Getter for {@link #groupId}. - * - * @return {@link #groupId} - */ - public String getGroupId() { - return groupId; - } - - /** - * Getter for {@link #mavenVersion}. - * - * @return {@link #mavenVersion} - */ - public MavenVersion getMavenVersion() { - return mavenVersion; - } - - /** - * Getter for {@link #scope}. - * - * @return {@link #scope} - */ - public String getScope() { - return scope; - } - - /** - * Getter for {@link #version}. - * - * @return {@link #version} - */ - public String getVersion() { - return version; - } - } } diff --git a/src/main/resources/usage.txt b/src/main/resources/usage.txt index 57b6021..a728607 100644 --- a/src/main/resources/usage.txt +++ b/src/main/resources/usage.txt @@ -5,7 +5,8 @@ Usage: jar --keywords|-k arch keywords --license|-l license name --pom|-p path to pom.xml that should be parsed, the path must - be relative to workdir + be relative to workdir (can be specified multiple + times) --portage-tree|-t path to portage tree that should be parsed when refreshing cache (default is /usr/portage) --refresh-cache|-c refreshes java ebuild cache