public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/java-ebuilder:master commit in: src/main/java/org/gentoo/java/ebuilder/, src/main/resources/, ...
@ 2015-11-06 19:08 Miroslav Šulc
  0 siblings, 0 replies; only message in thread
From: Miroslav Šulc @ 2015-11-06 19:08 UTC (permalink / raw
  To: gentoo-commits

commit:     3c19012e3269319dfc022a7dc123d8e1d7dfe31c
Author:     Miroslav Šulc <fordfrog <AT> fordfrog <DOT> com>
AuthorDate: Fri Nov  6 19:07:57 2015 +0000
Commit:     Miroslav Šulc <fordfrog <AT> gentoo <DOT> 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<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


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2015-11-06 19:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-06 19:08 [gentoo-commits] proj/java-ebuilder:master commit in: src/main/java/org/gentoo/java/ebuilder/, src/main/resources/, Miroslav Šulc

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox