You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by gs...@apache.org on 2007/12/03 12:12:24 UTC

svn commit: r600481 - in /ant/ivy/core/trunk: src/java/org/apache/ivy/plugins/parser/m2/ test/java/org/apache/ivy/core/resolve/ test/repositories/m2/org/relocated/test3/1.1/ test/repositories/m2/org/relocated/testRelocationUser/ test/repositories/m2/or...

Author: gscokart
Date: Mon Dec  3 03:12:23 2007
New Revision: 600481

URL: http://svn.apache.org/viewvc?rev=600481&view=rev
Log:
(IVY-586) don't stop the resolution if the module is relocated to an other version of the same module.  The complete fix requires to handle relocation in the resolution algorithm.  This version will continue the resolution taking partially into account the relocation, and printing an error.  Note that conflict resolution doesn't take into account the relocation

Added:
    ant/ivy/core/trunk/test/repositories/m2/org/relocated/test3/1.1/
    ant/ivy/core/trunk/test/repositories/m2/org/relocated/test3/1.1/test3-1.1.pom   (with props)
    ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/
    ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.0/
    ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.0/testRelocationUser-1.0.pom   (with props)
    ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.1/
    ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.1/testRelocationUser-1.1.pom   (with props)
Modified:
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java?rev=600481&r1=600480&r2=600481&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java Mon Dec  3 03:12:23 2007
@@ -146,8 +146,6 @@
 
         private String organisation;
         
-        private String relocationOrganisation = null;
-
         private String module;
 
         private String revision;
@@ -170,6 +168,8 @@
         
         private StringBuffer buffer = new StringBuffer();
 
+        private String relocationOrganisation = null;
+        
         private String relocationModule;
 
         private String relocationRevision;
@@ -262,8 +262,8 @@
                     && "project/dependencies/dependency".equals(context)) {
                 if (revision == null) {
                     // if the revision is null, see if we can get it from the dependency management
-                    String key = DEPENDENCY_MANAGEMENT + DEPENDENCY_MANAGEMENT_DELIMITER + organisation + 
-                        DEPENDENCY_MANAGEMENT_DELIMITER + module;
+                    String key = DEPENDENCY_MANAGEMENT + DEPENDENCY_MANAGEMENT_DELIMITER 
+                        + organisation + DEPENDENCY_MANAGEMENT_DELIMITER + module;
                     revision = (String) properties.get(key);
                 }
                 if (dd == null) {
@@ -329,27 +329,50 @@
                 organisation = null;
                 module = null;
             } else if ("project/distributionManagement/relocation".equals(context)) {
-                md.setModuleRevisionId(ModuleRevisionId
-                        .newInstance(organisation, module, revision));
-                if (relocationOrganisation == null ) {
+                if (relocationOrganisation == null) {
                     relocationOrganisation = organisation;
                 }
-                if (relocationModule == null ) {
+                if (relocationModule == null) {
                     relocationModule = module;
                 }
-                if (relocationRevision == null ) {
+                if (relocationRevision == null) {
                     relocationRevision = revision;
                 }
-                dd = new DefaultDependencyDescriptor(md, ModuleRevisionId.newInstance(
-                    relocationOrganisation, relocationModule, relocationRevision), true, false, true);
-                dd.addDependencyConfiguration("*", "@");
-                md.addDependency(dd);
-                dd = null;
+                ModuleRevisionId myModuleRev = ModuleRevisionId.newInstance(
+                    organisation, module, revision);
+                ModuleRevisionId relocationeModuleRev = ModuleRevisionId.newInstance(
+                    relocationOrganisation, relocationModule, relocationRevision);
+                md.setModuleRevisionId(myModuleRev);
+                if (relocationOrganisation.equals(organisation) 
+                        && relocationModule.equals(module)) {                    
+                    Message.error("Relocation to an other version number not supported in ivy : "
+                        + myModuleRev + " relocated to " + relocationModule 
+                        + ". Please update your dependency to directly use the right version.");
+                    Message.warn("Resolution will only pick dependencies of the relocated element." 
+                        + "  Artefact and other metadata will be ignored.");
+                    Parser relocationParser = parserOtherPom(relocationeModuleRev);
+                    if (relocationParser == null) {
+                        throw new SAXException("Relocation can not be found : " + relocationModule);
+                    }
+                    DependencyDescriptor[] dependencies = relocationParser.md.getDependencies();
+                    for (int i = 0; i < dependencies.length; i++) {
+                        md.addDependency(dependencies[i]);
+                    }                    
+                } else {
+                    Message.info(myModuleRev.toString() + " is relocated to " 
+                        + relocationeModuleRev + ". Please update your dependencies.");
+                    Message.verbose("Relocated module will be considered as a dependency");
+                    dd = new DefaultDependencyDescriptor(md, relocationeModuleRev,
+                        true, false, true);
+                    dd.addDependencyConfiguration("*", "@");
+                    md.addDependency(dd);
+                    dd = null;
+                }
             } else if ("project/dependencyManagement/dependencies/dependency".equals(context)) {
-                if ( dmGroupId != null && dmArtifactId != null && dmVersion != null ) {
+                if (dmGroupId != null && dmArtifactId != null && dmVersion != null) {
                    // Note: we can't use substitute pattern, fillMrid has not been called yet.
-                   String key = DEPENDENCY_MANAGEMENT + DEPENDENCY_MANAGEMENT_DELIMITER + dmGroupId + 
-                   DEPENDENCY_MANAGEMENT_DELIMITER + dmArtifactId;
+                   String key = DEPENDENCY_MANAGEMENT + DEPENDENCY_MANAGEMENT_DELIMITER 
+                       + dmGroupId + DEPENDENCY_MANAGEMENT_DELIMITER + dmArtifactId;
                    properties.put(key, dmVersion);
                 }
             }
@@ -393,7 +416,7 @@
                     return;
                 }
                 if (context.equals("project/distributionManagement/relocation/groupId")) {
-                    relocationOrganisation= txt;
+                    relocationOrganisation = txt;
                     return;
                 }
                 if (context.equals("project/distributionManagement/relocation/artifactId")) {
@@ -407,15 +430,18 @@
                 if (context.startsWith("project/parent")) {
                     return;
                 } 
-                if (context.equals("project/dependencyManagement/dependencies/dependency/groupId")) {
+                if (context.equals(
+                    "project/dependencyManagement/dependencies/dependency/groupId")) {
                     dmGroupId = txt;
                     return;
                 }
-                if (context.equals("project/dependencyManagement/dependencies/dependency/artifactId")) {
+                if (context.equals(
+                    "project/dependencyManagement/dependencies/dependency/artifactId")) {
                     dmArtifactId = txt;
                     return;
                 }
-                if (context.equals("project/dependencyManagement/dependencies/dependency/version")) {
+                if (context.equals(
+                    "project/dependencyManagement/dependencies/dependency/version")) {
                     dmVersion = txt;
                    return;
                 }
@@ -483,71 +509,80 @@
             if (parentOrg != null && parentName != null && parentVersion != null) {
                 ModuleRevisionId parent = ModuleRevisionId.newInstance(parentOrg, parentName, 
                                            parentVersion);
-                DependencyResolver resolver = settings.getResolver(parent.getModuleId());
-                if (resolver == null) {
-                    // TODO: Maybe log warning or throw exception here?
+                Parser parser = parserOtherPom(parent);
+                if (parser == null) {
+                    //see comments in parserOtherPom for case where parser==nul 
                     return;
                 }
                 
-                DependencyDescriptor dd = new DefaultDependencyDescriptor(parent, true);
-                ResolveData data = IvyContext.getContext().getResolveData();
-                if (data == null) {
-                    ResolveEngine engine = IvyContext.getContext().getIvy().getResolveEngine();
-                    ResolveOptions options = new ResolveOptions();
-                    options.setCache(IvyContext.getContext().getCacheManager());
-                    options.setDownload(false);
-                    data = new ResolveData(engine, options);
-                }
-                
-                ResolvedResource rr = resolver.findIvyFileRef(dd, data);
-                
-                if (rr == null) {
-                    // parent not found. Maybe we should throw an exception here?
-                    return;
-                }
-                
-                Parser parser = new Parser(getModuleDescriptorParser(), rr.getResource(), settings);
-                InputStream pomStream = null;
-                try {
-                    pomStream = rr.getResource().openStream();
-                    XMLHelper.parse(pomStream, null, parser, null);
-                } catch (IOException e) {
-                    throw new SAXException("Error occurred while parsing parent", e);
-                } catch (ParserConfigurationException e) {
-                    throw new SAXException("Error occurred while parsing parent", e);
-                } finally {
-                    if (pomStream != null) {
-                        try {
-                            pomStream.close();
-                        } catch (IOException e) {
-                            // ignore
-                        }
-                    }
-                }
-                
                 // move the parent properties into ours
                 Map parentProps = parser.properties;
                 Set keys = parentProps.keySet();
-                for ( Iterator iter = keys.iterator(); iter.hasNext();  ) {
+                for (Iterator iter = keys.iterator(); iter.hasNext();) {
                     String key = iter.next().toString();
-                    if ( key.startsWith("pom")) {
+                    if (key.startsWith("pom")) {
                         // don't see a need to copy pom values from parent...
                         // ignore
-                    } else if ( key.startsWith("parent")) {
+                    } else if (key.startsWith("parent")) {
                         // don't see a need to copy parent values from parent...
                         // ignore
                     } else {
                         // the key may need the groupId substituted
-                        String _key = IvyPatternHelper.substituteVariables(key, 
+                        String fullKey = IvyPatternHelper.substituteVariables(key, 
                                 parentProps).trim();
-                        String _value = IvyPatternHelper.substituteVariables(parentProps.get(key).toString(), 
-                                parentProps).trim();
-                        properties.put(_key, _value);
+                        String fullValue = IvyPatternHelper.substituteVariables(
+                                parentProps.get(key).toString(), parentProps).trim();
+                        properties.put(fullKey, fullValue);
                     }
                 }
 
             }
         }
+
+        private Parser parserOtherPom(ModuleRevisionId other) throws SAXException {
+            DependencyResolver resolver = settings.getResolver(other.getModuleId());
+            if (resolver == null) {
+                // TODO: Maybe log warning or throw exception here?
+                return null;
+            }
+            
+            DependencyDescriptor dd = new DefaultDependencyDescriptor(other, true);
+            ResolveData data = IvyContext.getContext().getResolveData();
+            if (data == null) {
+                ResolveEngine engine = IvyContext.getContext().getIvy().getResolveEngine();
+                ResolveOptions options = new ResolveOptions();
+                options.setCache(IvyContext.getContext().getCacheManager());
+                options.setDownload(false);
+                data = new ResolveData(engine, options);
+            }
+            
+            ResolvedResource rr = resolver.findIvyFileRef(dd, data);
+            
+            if (rr == null) {
+                // parent not found. Maybe we should throw an exception here?
+                return null;
+            }
+            
+            Parser parser = new Parser(getModuleDescriptorParser(), rr.getResource(), settings);
+            InputStream pomStream = null;
+            try {
+                pomStream = rr.getResource().openStream();
+                XMLHelper.parse(pomStream, null, parser, null);
+            } catch (IOException e) {
+                throw new SAXException("Error occurred while parsing parent", e);
+            } catch (ParserConfigurationException e) {
+                throw new SAXException("Error occurred while parsing parent", e);
+            } finally {
+                if (pomStream != null) {
+                    try {
+                        pomStream.close();
+                    } catch (IOException e) {
+                        // ignore
+                    }
+                }
+            }
+            return parser;
+        }
     }
 
     private static final PomModuleDescriptorParser INSTANCE = new PomModuleDescriptorParser();
@@ -559,8 +594,8 @@
     private PomModuleDescriptorParser() {
     }
 
-    public ModuleDescriptor parseDescriptor(ParserSettings settings, URL descriptorURL, Resource res,
-            boolean validate) throws ParseException, IOException {
+    public ModuleDescriptor parseDescriptor(ParserSettings settings, URL descriptorURL, 
+            Resource res, boolean validate) throws ParseException, IOException {
         Parser parser = new Parser(this, res, settings);
         try {
             XMLHelper.parse(descriptorURL, null, parser);

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java?rev=600481&r1=600480&r2=600481&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java Mon Dec  3 03:12:23 2007
@@ -3029,6 +3029,85 @@
         }
     }
 
+
+    public void testResolveVesionRelocationChainedWithGroupRelocation() throws Exception {
+        ivy = new Ivy();
+        ivy.configure(new File("test/repositories/m2/ivysettings.xml"));
+        ivy.pushContext();
+        try {        
+            ResolveReport report = ivy.resolve(new File(
+                    "test/repositories/m2/org/relocated/test3/1.1/test3-1.1.pom").toURL(),
+                getResolveOptions(new String[] {"*"}));
+            assertNotNull(report);
+    
+            // dependencies
+            assertTrue(ivy.getCacheManager(cache).getIvyFileInCache(
+                ModuleRevisionId.newInstance("org.apache", "test2", "1.0")).exists());
+            assertTrue(TestHelper.getArchiveFileInCache(ivy, cache, "org.apache", "test2", "1.0",
+                "test2", "jar", "jar").exists());
+    
+            assertTrue(ivy.getCacheManager(cache).getIvyFileInCache(
+                ModuleRevisionId.newInstance("org.apache", "test", "1.0")).exists());
+            assertTrue(TestHelper.getArchiveFileInCache(ivy, cache, "org.apache", "test", "1.0",
+                "test", "jar", "jar").exists());
+        } finally {
+            ivy.popContext();
+        }
+    }
+
+
+    public void testResolveTransitivelyToRelocatedPom() throws Exception {
+        ivy = new Ivy();
+        ivy.configure(new File("test/repositories/m2/ivysettings.xml"));
+        ivy.pushContext();
+        try {        
+            ResolveReport report = ivy.resolve(new File(
+                    "test/repositories/m2/org/relocated/testRelocationUser/1.0/" +
+                    "testRelocationUser-1.0.pom").toURL(),
+                getResolveOptions(new String[] {"compile"}));
+            assertNotNull(report);
+            assertFalse(report.hasError());
+            // dependencies
+            assertTrue(ivy.getCacheManager(cache).getIvyFileInCache(
+                ModuleRevisionId.newInstance("org.apache", "test2", "1.0")).exists());
+            assertTrue(TestHelper.getArchiveFileInCache(ivy, cache, "org.apache", "test2", "1.0",
+                "test2", "jar", "jar").exists());
+    
+            assertTrue(ivy.getCacheManager(cache).getIvyFileInCache(
+                ModuleRevisionId.newInstance("org.apache", "test", "1.0")).exists());
+            assertTrue(TestHelper.getArchiveFileInCache(ivy, cache, "org.apache", "test", "1.0",
+                "test", "jar", "jar").exists());
+        } finally {
+            ivy.popContext();
+        }
+    }
+
+    public void testResolveTransitivelyToPomRelocatedToNewVersion() throws Exception {
+        ivy = new Ivy();
+        ivy.configure(new File("test/repositories/m2/ivysettings.xml"));
+        ivy.pushContext();
+        try {        
+            ResolveReport report = ivy.resolve(new File(
+                    "test/repositories/m2/org/relocated/testRelocationUser/1.1/" +
+                    "testRelocationUser-1.1.pom").toURL(),
+                getResolveOptions(new String[] {"compile"}));
+            assertNotNull(report);
+            assertFalse(report.hasError());
+            // dependencies
+            assertTrue(ivy.getCacheManager(cache).getIvyFileInCache(
+                ModuleRevisionId.newInstance("org.apache", "test2", "1.0")).exists());
+            assertTrue(TestHelper.getArchiveFileInCache(ivy, cache, "org.apache", "test2", "1.0",
+                "test2", "jar", "jar").exists());
+    
+            assertTrue(ivy.getCacheManager(cache).getIvyFileInCache(
+                ModuleRevisionId.newInstance("org.apache", "test", "1.0")).exists());
+            assertTrue(TestHelper.getArchiveFileInCache(ivy, cache, "org.apache", "test", "1.0",
+                "test", "jar", "jar").exists());
+        } finally {
+            ivy.popContext();
+        }
+    }
+
     
     public void testResolveMaven2Classifiers() throws Exception {
         // test case for IVY-418

Added: ant/ivy/core/trunk/test/repositories/m2/org/relocated/test3/1.1/test3-1.1.pom
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/m2/org/relocated/test3/1.1/test3-1.1.pom?rev=600481&view=auto
==============================================================================
--- ant/ivy/core/trunk/test/repositories/m2/org/relocated/test3/1.1/test3-1.1.pom (added)
+++ ant/ivy/core/trunk/test/repositories/m2/org/relocated/test3/1.1/test3-1.1.pom Mon Dec  3 03:12:23 2007
@@ -0,0 +1,31 @@
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.relocated</groupId>
+  <artifactId>test3</artifactId>
+  <name>Test Module for Ivy M2 relocation parsing</name>
+  <version>1.1</version>
+  <distributionManagement>
+	<relocation>
+	   <version>1.0</version>
+    </relocation>
+  </distributionManagement>
+</project>

Propchange: ant/ivy/core/trunk/test/repositories/m2/org/relocated/test3/1.1/test3-1.1.pom
------------------------------------------------------------------------------
    svn:eol-style = native

Added: ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.0/testRelocationUser-1.0.pom
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.0/testRelocationUser-1.0.pom?rev=600481&view=auto
==============================================================================
--- ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.0/testRelocationUser-1.0.pom (added)
+++ ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.0/testRelocationUser-1.0.pom Mon Dec  3 03:12:23 2007
@@ -0,0 +1,33 @@
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.relocated</groupId>
+  <artifactId>testRelocationUser</artifactId>
+  <name>Test Module for Ivy M2 parsing depending on a relocated module</name>
+  <version>1.0</version>
+  <dependencies>
+    <dependency>
+      <groupId>org.relocated</groupId>
+      <artifactId>test3</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+</project>

Propchange: ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.0/testRelocationUser-1.0.pom
------------------------------------------------------------------------------
    svn:eol-style = native

Added: ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.1/testRelocationUser-1.1.pom
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.1/testRelocationUser-1.1.pom?rev=600481&view=auto
==============================================================================
--- ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.1/testRelocationUser-1.1.pom (added)
+++ ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.1/testRelocationUser-1.1.pom Mon Dec  3 03:12:23 2007
@@ -0,0 +1,33 @@
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.relocated</groupId>
+  <artifactId>testRelocationUser</artifactId>
+  <name>Test Module for Ivy M2 parsing depending on a relocated module</name>
+  <version>1.1</version>
+  <dependencies>
+    <dependency>
+      <groupId>org.relocated</groupId>
+      <artifactId>test3</artifactId>
+      <version>1.1</version>
+    </dependency>
+  </dependencies>
+</project>

Propchange: ant/ivy/core/trunk/test/repositories/m2/org/relocated/testRelocationUser/1.1/testRelocationUser-1.1.pom
------------------------------------------------------------------------------
    svn:eol-style = native