aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiroslav Šulc <fordfrog@fordfrog.com>2015-11-06 20:07:57 +0100
committerMiroslav Šulc <fordfrog@fordfrog.com>2015-11-06 20:07:57 +0100
commit3c19012e3269319dfc022a7dc123d8e1d7dfe31c (patch)
tree487c68b0e56a16adf22c587ec03a8c52394cf5e5
parentadded parsed maven version to maven project dependency class (diff)
downloadjava-ebuilder-3c19012e3269319dfc022a7dc123d8e1d7dfe31c.tar.gz
java-ebuilder-3c19012e3269319dfc022a7dc123d8e1d7dfe31c.tar.bz2
java-ebuilder-3c19012e3269319dfc022a7dc123d8e1d7dfe31c.zip
rewritten to be able to support multiple pom files (the multiple pom files ebuild creation is not implemented yet)
-rw-r--r--src/main/java/org/gentoo/java/ebuilder/Config.java33
-rw-r--r--src/main/java/org/gentoo/java/ebuilder/Main.java37
-rw-r--r--src/main/java/org/gentoo/java/ebuilder/maven/MavenDependency.java111
-rw-r--r--src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java436
-rw-r--r--src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java77
-rw-r--r--src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java137
-rw-r--r--src/main/resources/usage.txt3
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<Path> 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<Path> 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<MavenProject> 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<MavenProject> 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<ResolvedDependency> commonDependencies
- = resolveDependencies(mavenProject.getCommonDependencies(),
- mavenCache);
- final List<ResolvedDependency> testDependencies
- = resolveDependencies(mavenProject.getTestDependencies(),
- mavenCache);
- final List<ResolvedDependency> compileDependencies
- = resolveDependencies(mavenProject.getCompileDependencies(),
- mavenCache);
- final List<ResolvedDependency> 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<ResolvedDependency> dependencies) {
+ private String createClassPath(
+ final List<MavenDependency> 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<ResolvedDependency> testDepenencies,
- final List<ResolvedDependency> commonDependencies) {
- final List<ResolvedDependency> 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<MavenProject> 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<ResolvedDependency> resolveDependencies(
- final List<MavenProject.Dependency> dependencies,
- final MavenCache mavenCache) {
- final List<ResolvedDependency> result
- = new ArrayList<>(dependencies.size());
+ private String getMinSourceVersion(final List<MavenProject> 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<MavenProject> 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<ResolvedDependency> 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<String> mergeSystemDependencies(
+ final List<MavenProject> mavenProjects, final String type) {
+ final List<String> result = new ArrayList<>(30);
+
+ mavenProjects.stream().forEach((mavenProject) -> {
+ final List<MavenDependency> 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<ResolvedDependency> commonDependencies,
- final List<ResolvedDependency> testDependencies,
- final List<ResolvedDependency> compileDependencies,
- final List<ResolvedDependency> runtimeDependencies,
+ final List<MavenProject> mavenProjects,
final PrintWriter writer) {
- boolean hasCDepend = false;
-
- if (!commonDependencies.isEmpty() || !testDependencies.isEmpty()) {
- hasCDepend = true;
+ final List<String> commonDependencies = mergeSystemDependencies(
+ mavenProjects, "common");
+ final List<String> testDependencies = mergeSystemDependencies(
+ mavenProjects, "test");
+ final List<String> compileDependencies = mergeSystemDependencies(
+ mavenProjects, "compile");
+ final List<String> 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<ResolvedDependency> dependencies, final String useFlag) {
- dependencies.stream().forEach((ResolvedDependency dependency) -> {
+ final Path pomFile, final List<MavenDependency> 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<MavenProject> 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<ResolvedDependency> commonDependencies,
- final List<ResolvedDependency> testDependencies,
- final List<ResolvedDependency> compileDependencies,
- final List<ResolvedDependency> runtimeDependencies,
+ final List<MavenProject> 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<ResolvedDependency> dependencies
- = new ArrayList<>(commonDependencies.size()
- + runtimeDependencies.size());
- dependencies.addAll(commonDependencies);
- dependencies.addAll(runtimeDependencies);
+ if (!mavenProject.getCommonDependencies().isEmpty()
+ || !mavenProject.getRuntimeDependencies().isEmpty()) {
+ final List<MavenDependency> 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<MavenProject> parsePomFiles(final Config config,
+ final MavenCache mavenCache) {
+ final List<MavenProject> 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<Dependency> dependencies = new ArrayList<>(10);
+ private final List<MavenDependency> 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<Path> 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<Dependency> getCommonDependencies() {
+ public List<MavenDependency> getCommonDependencies() {
return getDependencies(new String[]{"compile"});
}
@@ -142,7 +154,7 @@ public class MavenProject {
*
* @return list of dependencies
*/
- public List<Dependency> getCompileDependencies() {
+ public List<MavenDependency> getCompileDependencies() {
return getDependencies(new String[]{"provided", "system"});
}
@@ -151,7 +163,7 @@ public class MavenProject {
*
* @return {@link #dependencies}
*/
- public List<Dependency> getDependencies() {
+ public List<MavenDependency> 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<Dependency> getRuntimeDependencies() {
+ public List<MavenDependency> getRuntimeDependencies() {
return getDependencies(new String[]{"runtime"});
}
@@ -324,7 +345,7 @@ public class MavenProject {
* @return list of dependencies
*/
@SuppressWarnings("unchecked")
- public List<Dependency> getTestDependencies() {
+ public List<MavenDependency> getTestDependencies() {
if (!hasTests()) {
return Collections.EMPTY_LIST;
}
@@ -443,10 +464,11 @@ public class MavenProject {
*
* @return list of dependencies
*/
- private List<Dependency> getDependencies(final String[] scopes) {
- final List<Dependency> result = new ArrayList<>(dependencies.size());
+ private List<MavenDependency> getDependencies(final String[] scopes) {
+ final List<MavenDependency> 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 <args>
--keywords|-k <keywords> arch keywords
--license|-l <license> license name
--pom|-p <file> 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