Author: xavier
Date: Tue May 22 15:41:55 2007
New Revision: 540781

URL: http://svn.apache.org/viewvc?view=rev&rev=540781
Log:
FIX: Some circular dependencies not retrieved (IVY-400)

Added:
    incubator/ivy/core/trunk/test/repositories/2/mod6.2/ivy-1.1.xml   (with 
props)
    incubator/ivy/core/trunk/test/repositories/2/mod6.2/mod6.2-1.1.jar   (with 
props)
    incubator/ivy/core/trunk/test/repositories/2/mod6.3/ivy-1.2.xml   (with 
props)
Modified:
    incubator/ivy/core/trunk/CHANGES.txt
    incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java
    
incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java
    incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java
    
incubator/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java

Modified: incubator/ivy/core/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/incubator/ivy/core/trunk/CHANGES.txt?view=diff&rev=540781&r1=540780&r2=540781
==============================================================================
--- incubator/ivy/core/trunk/CHANGES.txt (original)
+++ incubator/ivy/core/trunk/CHANGES.txt Tue May 22 15:41:55 2007
@@ -54,6 +54,7 @@
 - IMPROVEMENT: Remove @author tags (thanks to Stephane Bailliez)
 - IMPROVEMENT: Remove use of deprecated elements in ivysettings.xml (IVY-505) 
(with contribution from Jan Materne)
 
+- FIX: Some circular dependencies not retrieved (IVY-400)
 - FIX: ${version} property not recognized in poms (IVY-512)
 - FIX: Bug on handling dependency artifacts when a module configuration is 
specified (IVY-507)
 - FIX: Configure fails when having httpclient in classpath without 
commons-logging (IVY-502)

Modified: 
incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java
URL: 
http://svn.apache.org/viewvc/incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java?view=diff&rev=540781&r1=540780&r2=540781
==============================================================================
--- incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java 
(original)
+++ incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java 
Tue May 22 15:41:55 2007
@@ -131,7 +131,6 @@
     
     private boolean _downloaded = false;
     private boolean _searched = false;
-    private boolean _isCircular = false;
 
     private Collection _confsToFetch = new HashSet();
     private Collection _fetchedConfigurations = new HashSet();
@@ -865,14 +864,6 @@
     public boolean isLoaded() {
         return _md != null;
     }
-
-    /**
-     * Returns true if this node can already be found among its callers
-     * @return
-     */
-    public boolean isCircular() {
-        return _isCircular;
-    }
     
     public boolean isFetched(String conf) {
         return _fetchedConfigurations.contains(conf);
@@ -992,8 +983,8 @@
 
     public void addCaller(String rootModuleConf, IvyNode callerNode, String 
callerConf, String[] dependencyConfs, DependencyDescriptor dd) {
        _callers.addCaller(rootModuleConf, callerNode, callerConf, 
dependencyConfs, dd);
-        _isCircular = 
_callers.getAllCallersModuleIds().contains(getId().getModuleId());
-        if (_isCircular) {
+        boolean isCircular = 
_callers.getAllCallersModuleIds().contains(getId().getModuleId());
+        if (isCircular) {
                
IvyContext.getContext().getCircularDependencyStrategy().handleCircularDependency(
                                toMrids(findPath(getId().getModuleId()), this));
         }

Modified: 
incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java
URL: 
http://svn.apache.org/viewvc/incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java?view=diff&rev=540781&r1=540780&r2=540781
==============================================================================
--- 
incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java
 (original)
+++ 
incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java
 Tue May 22 15:41:55 2007
@@ -67,6 +67,17 @@
 import org.apache.ivy.util.Message;
 import org.apache.ivy.util.filter.Filter;
 
+/**
+ * The resolve engine which is the core of the dependency resolution
+ * mechanism used in Ivy.
+ * 
+ *  It features several resolve methods, some very simple, like [EMAIL 
PROTECTED] #resolve(File)} 
+ *  and [EMAIL PROTECTED] #resolve(URL)} which allow to simply resolve 
dependencies of a single
+ *  module descriptor, or more complete one, like the [EMAIL PROTECTED] 
#resolve(ModuleDescriptor, ResolveOptions)}
+ *  which allows to provide options to the resolution engine.
+ *  
+ *  @see ResolveOptions
+ */
 public class ResolveEngine {
        private IvySettings _settings;
        private EventManager _eventManager;
@@ -76,17 +87,34 @@
     private Set _fetchedSet = new HashSet();
        private DependencyResolver _dictatorResolver;
        
-       
+       /**
+        * Constructs a ResolveEngine.
+        * 
+        * @param settings the settings to use to configure the engine. Must 
not be null.
+        * @param eventManager the event manager to use to send events about 
the resolution process. Must not be null.
+        * @param sortEngine the sort engine to use to sort modules before 
producing the dependency resolution report. Must not be null.
+        */
     public ResolveEngine(IvySettings settings, EventManager eventManager, 
SortEngine sortEngine) {
                _settings = settings;
                _eventManager = eventManager;
                _sortEngine = sortEngine;
        }
 
+    /**
+     * Returns the currently configured dictator resolver, which when non
+     * null is used in place of any specified resolver in the [EMAIL 
PROTECTED] IvySettings}
+     * @return the currently configured dictator resolver, may be null.
+     */
        public DependencyResolver getDictatorResolver() {
         return _dictatorResolver;
     }
 
+       /**
+        * Sets a dictator resolver, which is used in place of regular 
dependency resolver 
+        * for subsequent dependency resolution by this engine.
+        * @param dictatorResolver the dictator resolver to use in this engine, 
+        *                null if regular settings should used
+        */
     public void setDictatorResolver(DependencyResolver dictatorResolver) {
         _dictatorResolver = dictatorResolver;
         _settings.setDictatorResolver(dictatorResolver);
@@ -366,7 +394,8 @@
                        throw new NullPointerException("null conf not allowed: 
confs where: "+Arrays.asList(confs));
                }
                
-            // for each configuration we clear the cache of what's been fetched
+               Message.verbose("resolving dependencies for configuration 
'"+confs[i]+"'");
+               // for each configuration we clear the cache of what's been 
fetched
             _fetchedSet.clear();     
             
             Configuration configuration = md.getConfiguration(confs[i]);
@@ -465,8 +494,10 @@
     private void fetchDependencies(VisitNode node, String conf, boolean 
shouldBePublic) {
        checkInterrupted();
         long start = System.currentTimeMillis();
-        if (_settings.debugConflictResolution()) {
-            Message.debug(node.getId()+" => resolving dependencies in "+conf);
+        if (node.getParent() != null) {
+               Message.verbose("== resolving dependencies 
"+node.getParent().getId()+"->"+node.getId()+" 
["+node.getParentConf()+"->"+conf+"]");
+        } else {
+               Message.verbose("== resolving dependencies for "+node.getId()+" 
["+conf+"]");
         }
         resolveConflict(node);
         

Modified: 
incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java
URL: 
http://svn.apache.org/viewvc/incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java?view=diff&rev=540781&r1=540780&r2=540781
==============================================================================
--- 
incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java 
(original)
+++ 
incubator/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java 
Tue May 22 15:41:55 2007
@@ -96,6 +96,13 @@
      * to get info on the current resolve process
      */
     private ResolveData _data;
+    /**
+     * Boolean.TRUE if a node with a same module id as the one visited 
+     * has already been visited in the current path.
+     * null if not computed yet
+     * Boolean.FALSE otherwise
+     */
+       private Boolean _isCircular;
 
     
     public VisitNode(ResolveData data, IvyNode node, VisitNode parent, String 
rootModuleConf, String parentConf) {
@@ -258,10 +265,12 @@
      * See getRealNode for details about what a 'real' node is.
      */
     public void useRealNode() {
-        IvyNode node = _data.getNode(_node.getId());
-        if (node != null && node != _node) {
-               _node = node;
-        }
+       if (_parent != null) { // use real node make sense only for non root 
module
+               IvyNode node = _data.getNode(_node.getId());
+               if (node != null && node != _node) {
+                       _node = node;
+               }
+       }
     }
 
     public boolean loadData(String conf, boolean shouldBePublic) {
@@ -384,9 +393,28 @@
                return _parent==null?null:_parent.getNode();
        }
 
-       public boolean isCircular() {
-               return _node.isCircular();
-       }
+
+    /**
+     * Returns true if this node can already be found in the path
+     * @return
+     */
+    public boolean isCircular() {
+       if (_isCircular == null) {
+            if (_parent != null) {
+               _isCircular = Boolean.FALSE; // asumme it's false, and see if 
it isn't by checking the parent path
+                for (Iterator iter = _parent.getPath().iterator(); 
iter.hasNext();) {
+                               VisitNode ancestor = (VisitNode) iter.next();
+                               if 
(getId().getModuleId().equals(ancestor.getId().getModuleId())) {
+                                       _isCircular = Boolean.TRUE;
+                                       break;
+                               }
+                       }
+            } else {
+                               _isCircular = Boolean.FALSE;
+            }
+       }
+       return _isCircular.booleanValue();
+    }
 
        public String[] getConfsToFetch() {
                return _node.getConfsToFetch();

Modified: 
incubator/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java
URL: 
http://svn.apache.org/viewvc/incubator/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java?view=diff&rev=540781&r1=540780&r2=540781
==============================================================================
--- 
incubator/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java 
(original)
+++ 
incubator/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java 
Tue May 22 15:41:55 2007
@@ -2051,6 +2051,43 @@
         }
     }
     
+    public void testCircular3() throws Exception {
+       // test case for IVY-400
+        // mod6.3 depends on mod6.2, which itself depends on mod6.3, 
+       // in both configuration default and test
+       
+        ResolveReport report = _ivy.resolve(new 
File("test/repositories/2/mod6.3/ivy-1.2.xml").toURL(),
+                getResolveOptions(new String[] {"default","test"}));
+        assertFalse(report.hasError());
+        // we should have mod 6.2 artifact in both configurations
+        assertEquals(1, 
report.getConfigurationReport("default").getArtifactsNumber()); 
+        assertEquals(1, 
report.getConfigurationReport("test").getArtifactsNumber()); 
+        
+        
_settings.setCircularDependencyStrategy(IgnoreCircularDependencyStrategy.getInstance());
+        report = _ivy.resolve(new 
File("test/repositories/2/mod6.3/ivy-1.2.xml").toURL(),
+                getResolveOptions(new String[] {"default","test"}));
+        assertFalse(report.hasError());
+        assertEquals(1, 
report.getConfigurationReport("default").getArtifactsNumber()); 
+        assertEquals(1, 
report.getConfigurationReport("test").getArtifactsNumber()); 
+        
+        
_settings.setCircularDependencyStrategy(WarnCircularDependencyStrategy.getInstance());
+        report = _ivy.resolve(new 
File("test/repositories/2/mod6.3/ivy-1.2.xml").toURL(),
+                       getResolveOptions(new String[] {"default","test"}));
+        assertFalse(report.hasError());
+        assertEquals(1, 
report.getConfigurationReport("default").getArtifactsNumber()); 
+        assertEquals(1, 
report.getConfigurationReport("test").getArtifactsNumber()); 
+        
+        
_settings.setCircularDependencyStrategy(ErrorCircularDependencyStrategy.getInstance());
+        try {
+               _ivy.resolve(new 
File("test/repositories/2/mod6.3/ivy-1.2.xml").toURL(),
+                       getResolveOptions(new String[] {"default","test"}));
+               fail("no exception with circular dependency strategy set to 
error");
+        } catch (CircularDependencyException ex)  {
+               assertEquals("[ org6 | mod6.3 | 1.2 ]->[ org6 | mod6.2 | 1.1 
]->[ org6 | mod6.3 | 1.2 ]", ex.getMessage());
+        }
+    }
+    
+    
     public void testRegularCircular() throws Exception {
         // mod11.1 depends on mod11.2 but excludes itself
         // mod11.2 depends on mod11.1

Added: incubator/ivy/core/trunk/test/repositories/2/mod6.2/ivy-1.1.xml
URL: 
http://svn.apache.org/viewvc/incubator/ivy/core/trunk/test/repositories/2/mod6.2/ivy-1.1.xml?view=auto&rev=540781
==============================================================================
--- incubator/ivy/core/trunk/test/repositories/2/mod6.2/ivy-1.1.xml (added)
+++ incubator/ivy/core/trunk/test/repositories/2/mod6.2/ivy-1.1.xml Tue May 22 
15:41:55 2007
@@ -0,0 +1,33 @@
+<!--
+   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.    
+-->
+<ivy-module version="1.0">
+       <info organisation="org6"
+              module="mod6.2"
+              revision="1.1"
+              status="integration"
+              publication="20070501110000"
+       />
+       <configurations>
+               <conf name="default"/>
+               <conf name="test"/>
+       </configurations>
+       <dependencies>
+               <dependency name="mod6.3" rev="1.2"/>
+       </dependencies>
+</ivy-module>

Propchange: incubator/ivy/core/trunk/test/repositories/2/mod6.2/ivy-1.1.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/ivy/core/trunk/test/repositories/2/mod6.2/mod6.2-1.1.jar
URL: 
http://svn.apache.org/viewvc/incubator/ivy/core/trunk/test/repositories/2/mod6.2/mod6.2-1.1.jar?view=auto&rev=540781
==============================================================================
Binary file - no diff available.

Propchange: incubator/ivy/core/trunk/test/repositories/2/mod6.2/mod6.2-1.1.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/ivy/core/trunk/test/repositories/2/mod6.3/ivy-1.2.xml
URL: 
http://svn.apache.org/viewvc/incubator/ivy/core/trunk/test/repositories/2/mod6.3/ivy-1.2.xml?view=auto&rev=540781
==============================================================================
--- incubator/ivy/core/trunk/test/repositories/2/mod6.3/ivy-1.2.xml (added)
+++ incubator/ivy/core/trunk/test/repositories/2/mod6.3/ivy-1.2.xml Tue May 22 
15:41:55 2007
@@ -0,0 +1,33 @@
+<!--
+   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.    
+-->
+<ivy-module version="1.0">
+       <info organisation="org6"
+              module="mod6.3"
+              revision="1.2"
+              status="integration"
+              publication="20070502110000"
+       />
+       <configurations>
+               <conf name="default"/>
+               <conf name="test"/>
+       </configurations>
+       <dependencies>
+               <dependency name="mod6.2" rev="1.1"/>
+       </dependencies>
+</ivy-module>

Propchange: incubator/ivy/core/trunk/test/repositories/2/mod6.3/ivy-1.2.xml
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to