You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by xa...@apache.org on 2008/04/03 16:26:29 UTC

svn commit: r644326 - in /ant/ivy/core/trunk: ./ src/java/org/apache/ivy/core/settings/ src/java/org/apache/ivy/plugins/resolver/ test/java/org/apache/ivy/core/resolve/ test/java/org/apache/ivy/core/settings/

Author: xavier
Date: Thu Apr  3 07:26:27 2008
New Revision: 644326

URL: http://svn.apache.org/viewvc?rev=644326&view=rev
Log:
FIX: No error or warning when a resolver references a non-existent cache (IVY-777)

Added:
    ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/Validatable.java   (with props)
    ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/ivysettings-cache-invalid.xml   (with props)
Modified:
    ant/ivy/core/trunk/CHANGES.txt
    ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java

Modified: ant/ivy/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=644326&r1=644325&r2=644326&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Thu Apr  3 07:26:27 2008
@@ -76,6 +76,7 @@
 - IMPROVEMENT: Change allownomd and skipbuildwithoutivy into a more semantically correct name (IVY-297)
 - IMPROVEMENT: Smarter determination if an expression is exact or not for RegexpPatternMatcher and GlobPatternMatcher
 
+- FIX: No error or warning when a resolver references a non-existent cache (IVY-777)
 - FIX: ivy properties defined in an include file not available in the file that includes it (IVY-780)
 - FIX: SFTPRepository.list(String) hides exceptions (IVY-751)
 - FIX: Wrong error message for republishing a module (IVY-752)

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java?rev=644326&r1=644325&r2=644326&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java Thu Apr  3 07:26:27 2008
@@ -675,6 +675,13 @@
     public void setDefaultCache(File cacheDirectory) {
         setVariable("ivy.cache.dir", cacheDirectory.getAbsolutePath(), false);
         defaultCache = cacheDirectory;
+        if (defaultRepositoryCacheManager != null) {
+            if ("default-cache".equals(defaultRepositoryCacheManager.getName())
+                    && defaultRepositoryCacheManager instanceof DefaultRepositoryCacheManager) {
+                ((DefaultRepositoryCacheManager) defaultRepositoryCacheManager)
+                    .setBasedir(defaultCache);
+            }
+        }
     }
 
     public void setDefaultResolver(String resolverName) {
@@ -735,10 +742,21 @@
     
     public void setDefaultRepositoryCacheBasedir(String repositoryCacheRoot) {
         setVariable("ivy.cache.repository", repositoryCacheRoot, true);
+        if (defaultRepositoryCacheManager != null
+                && "default-cache".equals(defaultRepositoryCacheManager.getName())
+                && defaultRepositoryCacheManager instanceof DefaultRepositoryCacheManager) {
+            ((DefaultRepositoryCacheManager) defaultRepositoryCacheManager)
+                .setBasedir(getDefaultRepositoryCacheBasedir());
+        }
     }
     
     public void setDefaultResolutionCacheBasedir(String resolutionCacheRoot) {
         setVariable("ivy.cache.resolution", resolutionCacheRoot, true);
+        if (resolutionCacheManager != null
+                && resolutionCacheManager instanceof DefaultResolutionCacheManager) {
+            ((DefaultResolutionCacheManager) resolutionCacheManager)
+                .setBasedir(getDefaultResolutionCacheBasedir());
+        }
     }
     
     public File getDefaultRepositoryCacheBasedir() {
@@ -1329,5 +1347,41 @@
             + " setting on the cache implementation instead");
         setDefaultUseOrigin(true);
         
+    }
+    
+    /**
+     * Validates the settings, throwing an {@link IllegalStateException} if the current state is not
+     * valid.
+     * 
+     * @throws IllegalStateException
+     *             if the settings is not valid.
+     */
+    public void validate() {
+        validateAll(resolversMap.values());
+        validateAll(conflictsManager.values());
+        validateAll(latestStrategies.values());
+        validateAll(lockStrategies.values());
+        validateAll(repositoryCacheManagers.values());
+        validateAll(reportOutputters.values());
+        validateAll(circularDependencyStrategies.values());
+        validateAll(versionMatchers.values());
+        validateAll(namespaces.values());
+    }
+
+    /**
+     * Validates all {@link Validatable} objects in the collection.
+     * 
+     * @param objects
+     *            the collection of objects to validate.
+     * @throws IllegalStateException
+     *             if any of the objects is not valid.
+     */
+    private void validateAll(Collection values) {
+        for (Iterator iterator = values.iterator(); iterator.hasNext();) {
+            Object object = (Object) iterator.next();
+            if (object instanceof Validatable) {
+                ((Validatable) object).validate();
+            }
+        }
     }
 }

Added: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/Validatable.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/Validatable.java?rev=644326&view=auto
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/Validatable.java (added)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/Validatable.java Thu Apr  3 07:26:27 2008
@@ -0,0 +1,32 @@
+/*
+ *  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.ivy.core.settings;
+
+/**
+ * Implemented by settings element which need to perform validation when settings are loaded.
+ */
+public interface Validatable {
+    /**
+     * Validates the Validatable, throwing an {@link IllegalStateException} if the current state is
+     * not valid.
+     * 
+     * @throws IllegalStateException
+     *             if the state of the {@link Validatable} is not valid.
+     */
+    public void validate();
+}

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/Validatable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/Validatable.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java?rev=644326&r1=644325&r2=644326&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java Thu Apr  3 07:26:27 2008
@@ -146,6 +146,7 @@
             InputSource inSrc = new InputSource(stream);
             inSrc.setSystemId(settingsUrl.toExternalForm());
             SAXParserFactory.newInstance().newSAXParser().parse(settingsUrl.toExternalForm(), this);
+            ivy.validate();
         } catch (IOException e) {
             throw e;
         } catch (Exception e) {

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java?rev=644326&r1=644325&r2=644326&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java Thu Apr  3 07:26:27 2008
@@ -19,6 +19,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Map;
 
 import org.apache.ivy.core.IvyContext;
@@ -47,6 +48,7 @@
 import org.apache.ivy.core.search.ModuleEntry;
 import org.apache.ivy.core.search.OrganisationEntry;
 import org.apache.ivy.core.search.RevisionEntry;
+import org.apache.ivy.core.settings.Validatable;
 import org.apache.ivy.plugins.latest.LatestStrategy;
 import org.apache.ivy.plugins.namespace.NameSpaceHelper;
 import org.apache.ivy.plugins.namespace.Namespace;
@@ -57,7 +59,8 @@
 /**
  * This abstract resolver only provides handling for resolver name
  */
-public abstract class AbstractResolver implements DependencyResolver, HasLatestStrategy {
+public abstract class AbstractResolver 
+        implements DependencyResolver, HasLatestStrategy, Validatable {
 
     /**
      * True if parsed ivy files should be validated against xsd, false if they should not, null if
@@ -196,24 +199,28 @@
 
     public LatestStrategy getLatestStrategy() {
         if (latestStrategy == null) {
-            if (getSettings() != null) {
-                if (latestStrategyName != null && !"default".equals(latestStrategyName)) {
-                    latestStrategy = getSettings().getLatestStrategy(latestStrategyName);
-                    if (latestStrategy == null) {
-                        Message.error("unknown latest strategy: " + latestStrategyName);
-                        latestStrategy = getSettings().getDefaultLatestStrategy();
-                    }
-                } else {
-                    latestStrategy = getSettings().getDefaultLatestStrategy();
-                    Message.debug(getName() + ": no latest strategy defined: using default");
+            initLatestStrategyFromSettings();
+        }
+        return latestStrategy;
+    }
+
+    private void initLatestStrategyFromSettings() {
+        if (getSettings() != null) {
+            if (latestStrategyName != null && !"default".equals(latestStrategyName)) {
+                latestStrategy = getSettings().getLatestStrategy(latestStrategyName);
+                if (latestStrategy == null) {
+                    throw new IllegalStateException(
+                        "unknown latest strategy '" + latestStrategyName + "'");
                 }
             } else {
-                throw new IllegalStateException(
-                    "no ivy instance found: "
-                    + "impossible to get a latest strategy without ivy instance");
+                latestStrategy = getSettings().getDefaultLatestStrategy();
+                Message.debug(getName() + ": no latest strategy defined: using default");
             }
+        } else {
+            throw new IllegalStateException(
+                "no ivy instance found: "
+                + "impossible to get a latest strategy without ivy instance");
         }
-        return latestStrategy;
     }
 
     public void setLatestStrategy(LatestStrategy latestStrategy) {
@@ -233,24 +240,28 @@
 
     public Namespace getNamespace() {
         if (namespace == null) {
-            if (getSettings() != null) {
-                if (namespaceName != null) {
-                    namespace = getSettings().getNamespace(namespaceName);
-                    if (namespace == null) {
-                        Message.error("unknown namespace: " + namespaceName);
-                        namespace = getSettings().getSystemNamespace();
-                    }
-                } else {
-                    namespace = getSettings().getSystemNamespace();
-                    Message.debug(getName() + ": no namespace defined: using system");
+            initNamespaceFromSettings();
+        }
+        return namespace;
+    }
+
+    private void initNamespaceFromSettings() {
+        if (getSettings() != null) {
+            if (namespaceName != null) {
+                namespace = getSettings().getNamespace(namespaceName);
+                if (namespace == null) {
+                    throw new IllegalStateException(
+                        "unknown namespace '" + namespaceName + "'");
                 }
             } else {
-                Message.verbose(getName()
-                        + ": no namespace defined nor ivy instance: using system namespace");
-                namespace = Namespace.SYSTEM_NAMESPACE;
+                namespace = getSettings().getSystemNamespace();
+                Message.debug(getName() + ": no namespace defined: using system");
             }
+        } else {
+            Message.verbose(getName()
+                    + ": no namespace defined nor ivy instance: using system namespace");
+            namespace = Namespace.SYSTEM_NAMESPACE;
         }
-        return namespace;
     }
 
     public void setNamespace(String namespaceName) {
@@ -324,16 +335,31 @@
     
     public RepositoryCacheManager getRepositoryCacheManager() {
         if (repositoryCacheManager == null) {
-            if (cacheManagerName == null) {
-                repositoryCacheManager = settings.getDefaultRepositoryCacheManager();
-            } else {
-                repositoryCacheManager = settings.getRepositoryCacheManager(cacheManagerName);
-            }
+            initRepositoryCacheManagerFromSettings();
         }
         return repositoryCacheManager;
     }
+
+    private void initRepositoryCacheManagerFromSettings() {
+        if (cacheManagerName == null) {
+            repositoryCacheManager = settings.getDefaultRepositoryCacheManager();
+            if (repositoryCacheManager == null) {
+                throw new IllegalStateException(
+                    "no default cache manager defined with current settings");
+            }
+        } else {
+            repositoryCacheManager = settings.getRepositoryCacheManager(cacheManagerName);
+            if (repositoryCacheManager == null) {
+                throw new IllegalStateException(
+                    "unknown cache manager '" + cacheManagerName 
+                    + "'. Available caches are " 
+                    + Arrays.asList(settings.getRepositoryCacheManagers()));
+            }
+        }
+    }
     
     public void setRepositoryCacheManager(RepositoryCacheManager repositoryCacheManager) {
+        this.cacheManagerName = repositoryCacheManager.getName();
         this.repositoryCacheManager = repositoryCacheManager;
     }
     
@@ -347,6 +373,12 @@
     
     public EventManager getEventManager() {
         return eventManager;
+    }
+    
+    public void validate() {
+        initRepositoryCacheManagerFromSettings();
+        initNamespaceFromSettings();
+        initLatestStrategyFromSettings();
     }
 
     protected CacheMetadataOptions getCacheOptions(ResolveData data) {

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=644326&r1=644325&r2=644326&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 Thu Apr  3 07:26:27 2008
@@ -370,6 +370,7 @@
         Ivy ivy = new Ivy();
         ivy.configure(new File("test/repositories/bugIVY-56/ivysettings.xml"));
         ivy.getSettings().setDefaultCache(cache);
+        ivy.getSettings().validate();
 
         ResolveReport report = ivy.resolve(new File(
                 "test/repositories/1/org1/mod1.1/ivys/ivy-1.0.xml").toURL(), getResolveOptions(ivy
@@ -682,6 +683,7 @@
             new File(ivy.getSettings().getDefaultCache(), "repository").getAbsolutePath());
         ivy.getSettings().setDefaultResolutionCacheBasedir(
             new File(ivy.getSettings().getDefaultCache(), "workspace").getAbsolutePath());
+        ivy.getSettings().validate();
         DefaultRepositoryCacheManager cacheMgr = 
             (DefaultRepositoryCacheManager) ivy.getSettings().getDefaultRepositoryCacheManager();
 

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java?rev=644326&r1=644325&r2=644326&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java Thu Apr  3 07:26:27 2008
@@ -18,6 +18,7 @@
 package org.apache.ivy.core.settings;
 
 import java.io.File;
+import java.text.ParseException;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -219,6 +220,18 @@
         
         assertEquals(c2, settings.getResolver("A").getRepositoryCacheManager());
         assertEquals(c, settings.getResolver("B").getRepositoryCacheManager());
+    }
+
+    public void testInvalidCache() throws Exception {
+        IvySettings settings = new IvySettings();
+        XmlSettingsParser parser = new XmlSettingsParser(settings);
+        
+        try {
+            parser.parse(XmlSettingsParserTest.class.getResource("ivysettings-cache-invalid.xml"));
+            fail("resolver referencing a non existent cache should raise an exception");
+        } catch (ParseException e) {
+            assertTrue(e.getMessage().indexOf("mycache") != -1);
+        }
     }
 
     public void testVersionMatchers1() throws Exception {

Added: ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/ivysettings-cache-invalid.xml
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/ivysettings-cache-invalid.xml?rev=644326&view=auto
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/ivysettings-cache-invalid.xml (added)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/ivysettings-cache-invalid.xml Thu Apr  3 07:26:27 2008
@@ -0,0 +1,29 @@
+<!--
+   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.    
+-->
+<ivysettings>
+	<caches default="mycache2">
+		<cache name="mycache2" />
+	</caches>
+	<resolvers>
+		<filesystem name="B" cache="mycache">
+			<ivy pattern="${libraries.dir}/[organisation]/[module]/ivys/ivy-[revision].xml"/>
+			<artifact pattern="${libraries.dir}/[organisation]/[module]/[type]s/[artifact]-[revision].[type]"/>
+		</filesystem>
+	</resolvers>
+</ivysettings>

Propchange: ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/ivysettings-cache-invalid.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/ivy/core/trunk/test/java/org/apache/ivy/core/settings/ivysettings-cache-invalid.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain