Repository: ant-ivy
Updated Branches:
  refs/heads/master a5f67ad88 -> da7d5df6d


IVY-1526 Use parent pom's license (if any) if the child pom doesn't explicitly 
have licenses of its own

Project: http://git-wip-us.apache.org/repos/asf/ant-ivy/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant-ivy/commit/da7d5df6
Tree: http://git-wip-us.apache.org/repos/asf/ant-ivy/tree/da7d5df6
Diff: http://git-wip-us.apache.org/repos/asf/ant-ivy/diff/da7d5df6

Branch: refs/heads/master
Commit: da7d5df6de444468ebdb4b79ae0d0dc3ac90b59d
Parents: a5f67ad
Author: Jaikiran Pai <[email protected]>
Authored: Sun Jul 19 21:50:14 2015 +0530
Committer: Nicolas Lalevée <[email protected]>
Committed: Sun Aug 30 15:51:44 2015 +0200

----------------------------------------------------------------------
 doc/release-notes.html                          |  2 +
 .../parser/m2/PomModuleDescriptorParser.java    | 11 ++-
 .../m2/PomModuleDescriptorParserTest.java       | 84 +++++++++++++++++++-
 .../parser/m2/test-parent-with-licenses.pom     | 36 +++++++++
 .../test-project-with-overridden-licenses.pom   | 43 ++++++++++
 .../m2/test-project-with-parent-licenses.pom    | 34 ++++++++
 6 files changed, 207 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/da7d5df6/doc/release-notes.html
----------------------------------------------------------------------
diff --git a/doc/release-notes.html b/doc/release-notes.html
index 48c5fe4..b29528c 100644
--- a/doc/release-notes.html
+++ b/doc/release-notes.html
@@ -59,6 +59,7 @@ List of changes since Ivy 2.4.0:
 
 - FIX: ArrayIndexOutOfBoundsException when using a p2 repository for 
dependencies (IVY-1504)
 - FIX: fixdeps remove transitive 'kept' dependencies
+- FIX: PomModuleDescriptorParser should parse licenses from parent POM 
(IVY-1526) (Thanks to Jaikiran Pai)
 
 - IMPROVEMENT: Optimization: limit the revision numbers scanned if revision 
prefix is specified (Thanks to Ernestas Vaiciukevi&#269;ius)
 
@@ -172,6 +173,7 @@ Here is the list of people who have contributed source code 
and documentation up
 <li>Mathias Muller</li>
 <li>Randy Nott</li>
 <li>Peter Oxenham</li>
+<li>Jaikiran Pai</li>
 <li>Douglas Palmer</li>
 <li>Jesper Pedersen</li>
 <li>Emmanuel Pellereau</li>

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/da7d5df6/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java 
b/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java
index 6017e3a..f4d6206 100644
--- a/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java
+++ b/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java
@@ -35,6 +35,7 @@ import 
org.apache.ivy.core.module.descriptor.Configuration.Visibility;
 import org.apache.ivy.core.module.descriptor.DefaultArtifact;
 import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
 import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivy.core.module.descriptor.License;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.resolve.ResolveData;
@@ -159,7 +160,15 @@ public final class PomModuleDescriptorParser implements 
ModuleDescriptorParser {
 
             mdBuilder.setHomePage(domReader.getHomePage());
             mdBuilder.setDescription(domReader.getDescription());
-            mdBuilder.setLicenses(domReader.getLicenses());
+            // if this module doesn't have an explicit license, use the 
parent's license (if any)
+            final License[] licenses = domReader.getLicenses();
+            if (licenses != null && licenses.length > 0) {
+                mdBuilder.setLicenses(licenses);
+            } else {
+                if (parentDescr != null) {
+                    mdBuilder.setLicenses(parentDescr.getLicenses());
+                }
+            }
 
             ModuleRevisionId relocation = domReader.getRelocation();
 

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/da7d5df6/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java
----------------------------------------------------------------------
diff --git 
a/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java 
b/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java
index d22d6ab..3b3c323 100644
--- 
a/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java
+++ 
b/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java
@@ -19,6 +19,8 @@ package org.apache.ivy.plugins.parser.m2;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
 import java.text.ParseException;
 import java.util.Arrays;
 import java.util.Collections;
@@ -40,8 +42,13 @@ import org.apache.ivy.core.settings.IvySettings;
 import org.apache.ivy.plugins.parser.AbstractModuleDescriptorParserTester;
 import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
 import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParserTest;
+import org.apache.ivy.plugins.repository.BasicResource;
+import org.apache.ivy.plugins.repository.LazyResource;
+import org.apache.ivy.plugins.repository.Resource;
 import org.apache.ivy.plugins.repository.url.URLResource;
+import org.apache.ivy.plugins.resolver.DependencyResolver;
 import org.apache.ivy.plugins.resolver.MockResolver;
+import org.xml.sax.SAXException;
 
 public class PomModuleDescriptorParserTest extends 
AbstractModuleDescriptorParserTester {
     // junit test -- DO NOT REMOVE used by ant to know it's a junit test
@@ -52,11 +59,14 @@ public class PomModuleDescriptorParserTest extends 
AbstractModuleDescriptorParse
         public ResolvedModuleRevision getDependency(DependencyDescriptor dd, 
ResolveData data)
                 throws ParseException {
             // TODO make it a real mock and check that dd and data are the one 
that are expected
-            DefaultModuleDescriptor moduleDesc = 
DefaultModuleDescriptor.newDefaultInstance(dd
-                    .getDependencyRevisionId());
+            final ModuleDescriptor moduleDesc = getModuleDescriptor(dd);
             ResolvedModuleRevision r = new ResolvedModuleRevision(this, this, 
moduleDesc, null);
             return r;
         }
+
+        protected ModuleDescriptor getModuleDescriptor(final 
DependencyDescriptor dependencyDescriptor) {
+            return 
DefaultModuleDescriptor.newDefaultInstance(dependencyDescriptor.getDependencyRevisionId());
+        }
     }
 
     private File dest = new File("build/test/test-write.xml");
@@ -608,6 +618,47 @@ public class PomModuleDescriptorParserTest extends 
AbstractModuleDescriptorParse
         assertEquals("http://www.apache.org/licenses/LICENSE-2.0.txt";, 
licenses[0].getUrl());
     }
 
+    /**
+     * Tests that if a module doesn't have a license specified, then parent 
pom's license (if any) is used for the child
+     * module
+     *
+     * @throws Exception
+     */
+    public void testLicenseFromParent() throws Exception {
+        final IvySettings customIvySettings = 
createIvySettingsForParentLicenseTesting("test-parent-with-licenses.pom",
+                "org.apache", "test-ivy-license-parent");
+        final String pomFile = "test-project-with-parent-licenses.pom";
+        final ModuleDescriptor childModule = 
PomModuleDescriptorParser.getInstance().parseDescriptor(customIvySettings,
+                this.getClass().getResource(pomFile), false);
+        assertNotNull("Could not find " + pomFile, pomFile);
+        final License[] licenses = childModule.getLicenses();
+        assertNotNull("No licenses found in the module " + childModule, 
licenses);
+        assertEquals("Unexpected number of licenses found in the module " + 
childModule, 1, licenses.length);
+        assertEquals("Unexpected license name", "MIT License", 
licenses[0].getName());
+        assertEquals("Unexpected license URL", 
"http://opensource.org/licenses/MIT";, licenses[0].getUrl());
+    }
+
+    /**
+     * Tests that if a project explicitly specifies the licenses, then the 
licenses (if any) from its parent pom
+     * aren't applied to the child project
+     *
+     * @throws Exception
+     */
+    public void testOverriddenLicense() throws Exception {
+        final IvySettings customIvySettings = 
createIvySettingsForParentLicenseTesting("test-parent-with-licenses.pom",
+                "org.apache", "test-ivy-license-parent");
+        final String pomFile = "test-project-with-overridden-licenses.pom";
+        final ModuleDescriptor childModule = 
PomModuleDescriptorParser.getInstance().parseDescriptor(customIvySettings,
+                this.getClass().getResource(pomFile), false);
+        assertNotNull("Could not find " + pomFile, pomFile);
+        final License[] licenses = childModule.getLicenses();
+        assertNotNull("No licenses found in the module " + childModule, 
licenses);
+        assertEquals("Unexpected number of licenses found in the module " + 
childModule, 1, licenses.length);
+        assertEquals("Unexpected license name", "The Apache Software License, 
Version 2.0", licenses[0].getName());
+        assertEquals("Unexpected license URL", 
"http://www.apache.org/licenses/LICENSE-2.0.txt";, licenses[0].getUrl());
+    }
+
+
     public void testDependencyManagment() throws ParseException, IOException {
         ModuleDescriptor md = 
PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
             getClass().getResource("test-dependencyMgt.pom"), false);
@@ -842,4 +893,33 @@ public class PomModuleDescriptorParserTest extends 
AbstractModuleDescriptorParse
         assertEquals("jar", artifact[0].getType());
     }
 
+    private IvySettings createIvySettingsForParentLicenseTesting(final String 
parentPomFileName, final String parentOrgName,
+                                                                 final String 
parentModuleName) throws Exception {
+        final URL parentPomURL = 
this.getClass().getResource(parentPomFileName);
+        assertNotNull("Could not find " + parentPomFileName, parentPomURL);
+        final PomReader parentPomReader = new PomReader(parentPomURL, new 
URLResource(parentPomURL));
+        final License[] parentLicenses = parentPomReader.getLicenses();
+        assertNotNull("Missing licenses in parent pom " + parentPomFileName, 
parentLicenses);
+        assertEquals("Unexpected number of licenses in parent pom " + 
parentPomFileName, 1, parentLicenses.length);
+        final DependencyResolver dependencyResolver = new 
MockedDependencyResolver() {
+            @Override
+            protected ModuleDescriptor 
getModuleDescriptor(DependencyDescriptor dependencyDescriptor) {
+                final String depOrg = 
dependencyDescriptor.getDependencyId().getOrganisation();
+                final String depModuleName = 
dependencyDescriptor.getDependencyId().getName();
+                if (depOrg.equals(parentOrgName) && 
depModuleName.equals(parentModuleName)) {
+                    final DefaultModuleDescriptor moduleDescriptor = 
DefaultModuleDescriptor.newDefaultInstance(dependencyDescriptor.getDependencyRevisionId());
+                    for (final License license : parentLicenses) {
+                        moduleDescriptor.addLicense(license);
+                    }
+                    return moduleDescriptor;
+                } else {
+                    return super.getModuleDescriptor(dependencyDescriptor);
+                }
+            }
+        };
+        final IvySettings ivySettings = new IvySettings();
+        ivySettings.setDictatorResolver(dependencyResolver);
+
+        return ivySettings;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/da7d5df6/test/java/org/apache/ivy/plugins/parser/m2/test-parent-with-licenses.pom
----------------------------------------------------------------------
diff --git 
a/test/java/org/apache/ivy/plugins/parser/m2/test-parent-with-licenses.pom 
b/test/java/org/apache/ivy/plugins/parser/m2/test-parent-with-licenses.pom
new file mode 100644
index 0000000..e39eb23
--- /dev/null
+++ b/test/java/org/apache/ivy/plugins/parser/m2/test-parent-with-licenses.pom
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!--
+   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.    
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache</groupId>
+    <artifactId>test-ivy-license-parent</artifactId>
+    <packaging>jar</packaging>
+    <name>Test License parent project</name>
+
+    <version>1.0.1</version>
+    <licenses>
+        <license>
+            <name>MIT License</name>
+            <url>http://opensource.org/licenses/MIT</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+</project>

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/da7d5df6/test/java/org/apache/ivy/plugins/parser/m2/test-project-with-overridden-licenses.pom
----------------------------------------------------------------------
diff --git 
a/test/java/org/apache/ivy/plugins/parser/m2/test-project-with-overridden-licenses.pom
 
b/test/java/org/apache/ivy/plugins/parser/m2/test-project-with-overridden-licenses.pom
new file mode 100644
index 0000000..9b6a91b
--- /dev/null
+++ 
b/test/java/org/apache/ivy/plugins/parser/m2/test-project-with-overridden-licenses.pom
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!--
+   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.    
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>test-ivy-license-parent</artifactId>
+        <version>1.0.1</version>
+    </parent>
+    <groupId>org.apache</groupId>
+    <artifactId>test-ivy-license-overridden</artifactId>
+    <packaging>jar</packaging>
+    <name>Test License project</name>
+
+    <version>1.0.2</version>
+
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+</project>

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/da7d5df6/test/java/org/apache/ivy/plugins/parser/m2/test-project-with-parent-licenses.pom
----------------------------------------------------------------------
diff --git 
a/test/java/org/apache/ivy/plugins/parser/m2/test-project-with-parent-licenses.pom
 
b/test/java/org/apache/ivy/plugins/parser/m2/test-project-with-parent-licenses.pom
new file mode 100644
index 0000000..a856df8
--- /dev/null
+++ 
b/test/java/org/apache/ivy/plugins/parser/m2/test-project-with-parent-licenses.pom
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!--
+   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.    
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>test-ivy-license-parent</artifactId>
+        <version>1.0.1</version>
+    </parent>
+    <groupId>org.apache</groupId>
+    <artifactId>test-ivy-license</artifactId>
+    <packaging>jar</packaging>
+    <name>Test License project</name>
+
+    <version>1.0.2</version>
+</project>

Reply via email to