You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2017/12/10 15:36:58 UTC

[sling-slingstart-maven-plugin] 01/01: SLING-7302 consider the project's artifact itself for the PomArtifactVersionResolver

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch feature/extend-pom-artifact-version-resolver
in repository https://gitbox.apache.org/repos/asf/sling-slingstart-maven-plugin.git

commit f8c5909dfa58bd1e2502cd7e96dbe8c787ef433f
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Sun Dec 10 16:34:12 2017 +0100

    SLING-7302 consider the project's artifact itself for the
    PomArtifactVersionResolver
    
    add some test cases and extend javadoc
---
 .../maven/slingstart/AbstractSlingStartMojo.java   | 12 +++-
 .../slingstart/PomArtifactVersionResolver.java     | 33 +++++++++-
 .../slingstart/PomArtifactVersionResolverTest.java | 74 ++++++++++++++++++++++
 3 files changed, 113 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java b/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java
index b086de7..11c25d1 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/AbstractSlingStartMojo.java
@@ -94,7 +94,7 @@ public abstract class AbstractSlingStartMojo extends AbstractMojo {
     protected MavenSession mavenSession;
 
     /**
-     * If set to true, properties from the Maven POM can be used as variables in the provisioning files.
+     * If set to {@code true}, properties from the Maven POM can be used as variables in the provisioning files.
      * The resolved variables are added to the generated provisioning file, so other tools using this model
      * do not have to resolve them themselves.
      */
@@ -102,8 +102,14 @@ public abstract class AbstractSlingStartMojo extends AbstractMojo {
     protected boolean usePomVariables;
 
     /**
-     * If set to true, Artifact dependencies from provisioning file without explicit version are tried
-     * to be resolved against the dependency versions from the Maven POM.
+     * If set to {@code true}, Artifact dependencies from provisioning file without explicit version are tried
+     * to be resolved against the versions given in the Maven POM.
+     * The following sections in the effective pom are considered during resolving the version:
+     * <ol>
+     *   <li>The project's artifact itself</li>
+     *   <li>The project's dependencies</li>
+     *   <li>The project's dependencyManagement</li>
+     * </ol>
      */
     @Parameter(defaultValue="false")
     protected boolean usePomDependencies;
diff --git a/src/main/java/org/apache/sling/maven/slingstart/PomArtifactVersionResolver.java b/src/main/java/org/apache/sling/maven/slingstart/PomArtifactVersionResolver.java
index 8fa941f..f2dd228 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/PomArtifactVersionResolver.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/PomArtifactVersionResolver.java
@@ -29,6 +29,12 @@ import org.apache.sling.provisioning.model.ModelUtility.ArtifactVersionResolver;
 /**
  * Provisioning artifact resolver that tries to resolve artifacts in provisioning file without version (LATEST)
  * against the dependencies defined in the maven project.
+ * The following sections in the Maven project are considered during resolving the version:
+ * <ol>
+ *   <li>The project's artifact itself</li>
+ *   <li>The project's dependencies</li>
+ *   <li>The project's dependencyManagement</li>
+ * </ol>
  */
 public class PomArtifactVersionResolver implements ArtifactVersionResolver {
 
@@ -46,10 +52,15 @@ public class PomArtifactVersionResolver implements ArtifactVersionResolver {
     
     @Override
     public String resolve(Artifact artifact) {
+        if (artifactEquals(project.getArtifact(), artifact)) {
+            return project.getVersion();
+        }
+        
         String version = findVersion(project.getDependencies(), artifact);
         if (version != null) {
             return version;
         }
+        
         if (project.getDependencyManagement() != null) {
             version = findVersion(project.getDependencyManagement().getDependencies(), artifact);
             if (version != null) {
@@ -75,11 +86,27 @@ public class PomArtifactVersionResolver implements ArtifactVersionResolver {
         return null;
     }
     
-    private boolean artifactEquals(Dependency dependency, Artifact artifact) {
+    static boolean artifactEquals(Dependency dependency, Artifact artifact) {
         return StringUtils.equals(dependency.getGroupId(), artifact.getGroupId())
                 && StringUtils.equals(dependency.getArtifactId(), artifact.getArtifactId())
                 && StringUtils.equals(dependency.getClassifier(), artifact.getClassifier())
-                && StringUtils.equals(dependency.getType(), artifact.getType());
+                && StringUtils.equals(normalizeType(dependency.getType()), normalizeType(artifact.getType()));
+    }
+    
+    static boolean artifactEquals(org.apache.maven.artifact.Artifact artifact, Artifact artifact2) {
+        return StringUtils.equals(artifact.getGroupId(), artifact2.getGroupId())
+                && StringUtils.equals(artifact.getArtifactId(), artifact2.getArtifactId())
+                && StringUtils.equals(artifact.getClassifier(), artifact2.getClassifier())
+                && StringUtils.equals(normalizeType(artifact.getType()), normalizeType(artifact2.getType()));
+    }
+    
+    static String normalizeType(String type) {
+        // bundles are often referred to with type "jar" in the provisioning model.
+        // especially when leaving out the version you cannot even specify a type different from the default "jar"
+        if (type.equals("bundle")) {
+            return "jar";
+        } else {
+            return type;
+        }
     }
-
 }
diff --git a/src/test/java/org/apache/sling/maven/slingstart/PomArtifactVersionResolverTest.java b/src/test/java/org/apache/sling/maven/slingstart/PomArtifactVersionResolverTest.java
new file mode 100644
index 0000000..47f43a7
--- /dev/null
+++ b/src/test/java/org/apache/sling/maven/slingstart/PomArtifactVersionResolverTest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.maven.slingstart;
+
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
+import org.apache.maven.model.Dependency;
+import org.apache.sling.provisioning.model.Artifact;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PomArtifactVersionResolverTest {
+
+    @Test
+    public void testNormalizeType() {
+        Assert.assertEquals("jar", PomArtifactVersionResolver.normalizeType("jar"));
+        Assert.assertEquals("jar", PomArtifactVersionResolver.normalizeType("bundle"));
+        Assert.assertEquals("bla", PomArtifactVersionResolver.normalizeType("bla"));
+    }
+
+    @Test
+    public void testArtifactEqualsForMavenArtifact() {
+        Assert.assertTrue(PomArtifactVersionResolver.artifactEquals(
+                new DefaultArtifact("somegroup", "someartifact", "someversion", "somescope", "sometype", "someclassifier", new DefaultArtifactHandler()),
+                new Artifact("somegroup", "someartifact", "someversion", "someclassifier", "sometype")));
+        // test maven artifact with type "bundle", other with type "jar"
+        Assert.assertTrue(PomArtifactVersionResolver.artifactEquals(
+                new DefaultArtifact("somegroup", "someartifact", "someversion", "somescope", "bundle", "someclassifier", new DefaultArtifactHandler()), 
+                new Artifact("somegroup", "someartifact", "someversion", "someclassifier", "jar")));
+        
+        // test without classifier
+        Assert.assertTrue(PomArtifactVersionResolver.artifactEquals(
+                new DefaultArtifact("somegroup", "someartifact", "someversion", "somescope", "bundle", null, new DefaultArtifactHandler()), 
+                new Artifact("somegroup", "someartifact", "LATEST", null, "jar")));
+    }
+    
+    @Test
+    public void testArtifactEqualsForMavenDependencies() {
+        Dependency dependency = new Dependency();
+        dependency.setGroupId("somegroup");
+        dependency.setArtifactId("someartifact");
+        dependency.setVersion("someversion");
+        dependency.setClassifier("someclassifier");
+        dependency.setType("sometype");
+        Assert.assertTrue(PomArtifactVersionResolver.artifactEquals(
+                dependency,
+                new Artifact("somegroup", "someartifact", "someversion", "someclassifier", "sometype")));
+        // test dependency with type "bundle", other with type "jar"
+        dependency.setType("bundle");
+        Assert.assertTrue(PomArtifactVersionResolver.artifactEquals(
+                dependency, 
+                new Artifact("somegroup", "someartifact", "someversion", "someclassifier", "jar")));
+        
+        // test without classifier
+        dependency.setClassifier(null);
+        Assert.assertTrue(PomArtifactVersionResolver.artifactEquals(
+                dependency, 
+                new Artifact("somegroup", "someartifact", "LATEST", null, "jar")));
+    }
+}

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.