added retry when downloading content from external sources to hopefully avoid some false positives

git-svn-id: https://svn.apache.org/repos/asf/maven/sandbox/trunk@1765009 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dist-tools/dist-tool-plugin/pom.xml b/dist-tools/dist-tool-plugin/pom.xml
index 0347d9e..ebff0f2 100644
--- a/dist-tools/dist-tool-plugin/pom.xml
+++ b/dist-tools/dist-tool-plugin/pom.xml
@@ -17,7 +17,7 @@
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven-parent</artifactId>
-    <version>27</version>
+    <version>30</version>
     <relativePath>../../../pom/maven/pom.xml</relativePath>
   </parent>
 
diff --git a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/JsoupRetry.java b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/JsoupRetry.java
new file mode 100644
index 0000000..60f374d
--- /dev/null
+++ b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/JsoupRetry.java
@@ -0,0 +1,68 @@
+package org.apache.maven.dist.tools;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+/**
+ * Reads a url with Jsoup, retrying multiple times in case of IOException.
+ */
+public class JsoupRetry
+{
+    public static final int MAX_RETRY = 3;
+
+    public static final int WAIT_RETRY_SECONDS = 10;
+
+    public static Document get( String url )
+        throws IOException
+    {
+        for ( int i = 1; i <= MAX_RETRY; i++ )
+        {
+            try
+            {
+                return Jsoup.connect( url ).get();
+            }
+            catch ( IOException ioe )
+            {
+                System.err.println( "IOException try " + i + " while reading " + url + ": " + ioe.getClass() + " "
+                    + ioe.getMessage() );
+
+                if ( i == MAX_RETRY )
+                {
+                    throw new IOException( "IOException while reading " + url, ioe );
+                }
+            }
+
+            try
+            {
+                Thread.sleep( WAIT_RETRY_SECONDS * 1000 );
+            }
+            catch ( InterruptedException e )
+            {
+                // not expected to happen
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/index/DistCheckIndexPageMojo.java b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/index/DistCheckIndexPageMojo.java
index aadcb54..5e7311f 100644
--- a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/index/DistCheckIndexPageMojo.java
+++ b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/index/DistCheckIndexPageMojo.java
@@ -34,12 +34,12 @@
 import org.apache.maven.dist.tools.AbstractCheckResult;
 import org.apache.maven.dist.tools.AbstractDistCheckMojo;
 import org.apache.maven.dist.tools.ConfigurationLineInfo;
+import org.apache.maven.dist.tools.JsoupRetry;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.reporting.MavenReportException;
-import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
@@ -288,14 +288,7 @@
         if ( doc == null )
         {
             // document not yet downloaded: download and cache
-            try
-            {
-                doc = Jsoup.connect( indexPage.url ).get();
-            }
-            catch ( IOException ioe )
-            {
-                throw new IOException( "IOException while reading " + indexPage.url, ioe );
-            }
+            doc = JsoupRetry.get( indexPage.url );
             indexPage.document = doc;
         }
 
diff --git a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/prerequisites/GetPrerequisites.java b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/prerequisites/GetPrerequisites.java
index 0304962..d59d8e6 100644
--- a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/prerequisites/GetPrerequisites.java
+++ b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/prerequisites/GetPrerequisites.java
@@ -26,7 +26,7 @@
 import java.util.Map;
 
 import org.apache.maven.artifact.versioning.ArtifactVersion;
-import org.jsoup.Jsoup;
+import org.apache.maven.dist.tools.JsoupRetry;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
@@ -104,7 +104,7 @@
     {
         String url = getPluginInfoUrl( pluginName );
 
-        Document doc = Jsoup.connect( url ).get();
+        Document doc = JsoupRetry.get( url );
 
         Elements select = doc.select( "table.bodyTable" ); // Stylus skin
 
diff --git a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/site/DistCheckSiteMojo.java b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/site/DistCheckSiteMojo.java
index d98eb82..3108c75 100644
--- a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/site/DistCheckSiteMojo.java
+++ b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/site/DistCheckSiteMojo.java
@@ -30,6 +30,7 @@
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.dist.tools.AbstractDistCheckMojo;
 import org.apache.maven.dist.tools.ConfigurationLineInfo;
+import org.apache.maven.dist.tools.JsoupRetry;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.SinkEventAttributeSet;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -40,7 +41,6 @@
 import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.reporting.MavenReportException;
 import org.jsoup.HttpStatusException;
-import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.openqa.selenium.OutputType;
 import org.openqa.selenium.TakesScreenshot;
@@ -281,7 +281,7 @@
             }
 
             result.setUrl( siteUrl );
-            Document doc = Jsoup.connect( siteUrl ).get();
+            Document doc = JsoupRetry.get( siteUrl );
             if ( screenShot )
             {
                 driver.get( artifactProject.getUrl() );
diff --git a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/source/DistCheckSourceReleaseMojo.java b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/source/DistCheckSourceReleaseMojo.java
index 076930c..0963e5d 100644
--- a/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/source/DistCheckSourceReleaseMojo.java
+++ b/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/source/DistCheckSourceReleaseMojo.java
@@ -28,6 +28,7 @@
 
 import org.apache.maven.dist.tools.AbstractDistCheckMojo;
 import org.apache.maven.dist.tools.ConfigurationLineInfo;
+import org.apache.maven.dist.tools.JsoupRetry;
 import org.apache.maven.doxia.markup.HtmlMarkup;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.SinkEventAttributeSet;
@@ -35,7 +36,6 @@
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.reporting.MavenReportException;
-import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
@@ -414,13 +414,13 @@
             if ( !url.equals( cachedUrl ) )
             {
                 cachedUrl = url;
-                cachedDocument = Jsoup.connect( url ).get();
+                cachedDocument = JsoupRetry.get( url );
             }
             return cachedDocument;
         }
         else
         {
-            return Jsoup.connect( url ).get();
+            return JsoupRetry.get( url );
         }
     }