Repository: ant-ivy
Updated Branches:
  refs/heads/master 368f1da7f -> b6284ae1d


IVY-1555 Don't error out if an "optional" file included in ivy settings xml 
isn't available


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

Branch: refs/heads/master
Commit: efa756288e712849c78c4230df05c2d1abeba91e
Parents: 5601c44
Author: Jaikiran Pai <jaikiran....@gmail.com>
Authored: Sun May 21 17:31:47 2017 +0530
Committer: Jaikiran Pai <jaikiran....@gmail.com>
Committed: Tue May 30 09:46:46 2017 +0530

----------------------------------------------------------------------
 .../ivy/core/settings/XmlSettingsParser.java    | 69 +++++++++++++-------
 .../org/apache/ivy/ant/IvyConfigureTest.java    | 20 ++++++
 .../ivysettings-optional-file-include.xml       | 27 ++++++++
 3 files changed, 93 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/efa75628/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java 
b/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java
index f85c295..81d0f9a 100644
--- a/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java
+++ b/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java
@@ -392,6 +392,7 @@ public class XmlSettingsParser extends DefaultHandler {
     private void includeStarted(Map attributes) throws IOException, 
ParseException {
         final IvyVariableContainer variables = ivy.getVariableContainer();
         ivy.setVariableContainer(new IvyVariableContainerWrapper(variables));
+        final boolean optionalInclude = 
"true".equals(attributes.get("optional"));
         try {
             String propFilePath = (String) attributes.get("file");
             URL settingsURL = null;
@@ -402,38 +403,60 @@ public class XmlSettingsParser extends DefaultHandler {
                             "bad include tag: specify file or url to include");
                 } else {
                     try {
-                        // First assume that it is an absolute URL
-                        settingsURL = new URL(propFilePath);
-                    } catch (MalformedURLException e) {
-                        // If that fail, it may be because it is a relative 
one.
-                        settingsURL = new URL(this.settings, propFilePath);
+                        try {
+                            // First assume that it is an absolute URL
+                            settingsURL = new URL(propFilePath);
+                        } catch (MalformedURLException e) {
+                            // If that fail, it may be because it is a 
relative one.
+                            settingsURL = new URL(this.settings, propFilePath);
+                        }
+                    } catch (IOException ioe) {
+                        if (!optionalInclude) {
+                            throw ioe;
+                        }
+                        Message.verbose("Skipping inclusion of optional URL " 
+ propFilePath + " due to IOException - " + ioe.getMessage());
+                        return;
                     }
                     Message.verbose("including url: " + 
settingsURL.toString());
                     ivy.setSettingsVariables(settingsURL);
                 }
             } else {
-                settingsURL = urlFromFileAttribute(propFilePath);
-                Message.verbose("including file: " + settingsURL);
-                if ("file".equals(settingsURL.getProtocol())) {
-                    try {
-                        File settingsFile = new File(new 
URI(settingsURL.toExternalForm()));
-                        String optional = (String) attributes.get("optional");
-                        if ("true".equals(optional) && !settingsFile.exists()) 
{
-                            return;
+                try {
+                    settingsURL = urlFromFileAttribute(propFilePath);
+                    Message.verbose("including file: " + settingsURL);
+                    if ("file".equals(settingsURL.getProtocol())) {
+                        try {
+                            File settingsFile = new File(new 
URI(settingsURL.toExternalForm()));
+                            if (optionalInclude && !settingsFile.exists()) {
+                                return;
+                            }
+                            
ivy.setSettingsVariables(Checks.checkAbsolute(settingsFile,
+                                    "settings include path"));
+                        } catch (URISyntaxException e) {
+                            // try to make the best of it...
+                            
ivy.setSettingsVariables(Checks.checkAbsolute(settingsURL.getPath(),
+                                    "settings include path"));
                         }
-
-                        
ivy.setSettingsVariables(Checks.checkAbsolute(settingsFile,
-                            "settings include path"));
-                    } catch (URISyntaxException e) {
-                        // try to make the best of it...
-                        
ivy.setSettingsVariables(Checks.checkAbsolute(settingsURL.getPath(),
-                            "settings include path"));
+                    } else {
+                        ivy.setSettingsVariables(settingsURL);
                     }
-                } else {
-                    ivy.setSettingsVariables(settingsURL);
+                } catch (IOException ioe) {
+                    if (!optionalInclude) {
+                        throw ioe;
+                    }
+                    Message.verbose("Skipping inclusion of optional file " + 
propFilePath + " due to IOException - " + ioe.getMessage());
+                    return;
+                }
+            }
+            try {
+                new XmlSettingsParser(ivy).parse(configurator, settingsURL);
+            } catch (IOException ioe) {
+                if (!optionalInclude) {
+                    throw ioe;
                 }
+                Message.verbose("Skipping inclusion of optional settings URL " 
+ settingsURL + " due to IOException - " + ioe.getMessage());
+                return;
             }
-            new XmlSettingsParser(ivy).parse(configurator, settingsURL);
         } finally {
             ivy.setVariableContainer(variables);
         }

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/efa75628/test/java/org/apache/ivy/ant/IvyConfigureTest.java
----------------------------------------------------------------------
diff --git a/test/java/org/apache/ivy/ant/IvyConfigureTest.java 
b/test/java/org/apache/ivy/ant/IvyConfigureTest.java
index a781ffe..8568f62 100644
--- a/test/java/org/apache/ivy/ant/IvyConfigureTest.java
+++ b/test/java/org/apache/ivy/ant/IvyConfigureTest.java
@@ -18,9 +18,11 @@
 package org.apache.ivy.ant;
 
 import java.io.File;
+import java.util.List;
 
 import org.apache.ivy.Ivy;
 import org.apache.ivy.TestHelper;
+import org.apache.ivy.core.module.status.Status;
 import org.apache.ivy.core.settings.IvySettings;
 import org.apache.ivy.plugins.resolver.DependencyResolver;
 import org.apache.ivy.plugins.resolver.IBiblioResolver;
@@ -305,4 +307,22 @@ public class IvyConfigureTest {
         configure.setOverride("unknown");
     }
 
+    /**
+     * Tests that if the Ivy settings file <code>include</code>s another file 
as <code>optional</code>,
+     * then the absence of that file doesn't lead to failures
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testOptionalFileInclude() throws Exception {
+        final File ivySettingsXml = new 
File("test/repositories/ivysettings-optional-file-include.xml");
+        final Ivy ivy = new Ivy();
+        ivy.configure(ivySettingsXml);
+        final IvySettings ivySettings = ivy.getSettings();
+        // just test that it indeed parsed fine
+        assertTrue("Unexpected number of resolvers in Ivy settings", 
ivySettings.getResolvers().isEmpty());
+        final List<Status> statuses 
=ivySettings.getStatusManager().getStatuses();
+        assertEquals("Unexpected number of custom status in parsed Ivy 
settings", 1, statuses.size());
+        assertEquals("Custom status not found in the parsed Ivy settings", 
"ivy-1555", statuses.get(0).getName());
+    }
 }

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/efa75628/test/repositories/ivysettings-optional-file-include.xml
----------------------------------------------------------------------
diff --git a/test/repositories/ivysettings-optional-file-include.xml 
b/test/repositories/ivysettings-optional-file-include.xml
new file mode 100644
index 0000000..07d81e5
--- /dev/null
+++ b/test/repositories/ivysettings-optional-file-include.xml
@@ -0,0 +1,27 @@
+<!--
+   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>
+    <!-- Include a non-existent file and mark it optional -->
+    <include file="${ivy.settings.dir}/foo/bar/i-am-not-present.xml" 
optional="true"/>
+    <!-- Same as previous non-existent file, but use an url attribute this 
time -->
+    <include url="${ivy.settings.dir.url}/foo/bar/i-am-not-present.xml" 
optional="true"/>
+    <statuses>
+        <status name="ivy-1555" integration="false"/>
+    </statuses>
+</ivysettings>

Reply via email to