This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch MNG-7134
in repository https://gitbox.apache.org/repos/asf/maven.git

commit ec02e31f5d457fcdb94731579fcd9554edd2cccc
Author: Hervé Boutemy <hbout...@apache.org>
AuthorDate: Sat Mar 13 18:40:48 2021 +0100

    [MNG-7116] add support for mirrorOf external:http:*
---
 .../maven/repository/DefaultMirrorSelector.java    | 51 +++++++++++++++++++---
 .../apache/maven/bridge/MavenRepositorySystem.java | 48 ++++++++++++++++++--
 2 files changed, 89 insertions(+), 10 deletions(-)

diff --git 
a/maven-compat/src/main/java/org/apache/maven/repository/DefaultMirrorSelector.java
 
b/maven-compat/src/main/java/org/apache/maven/repository/DefaultMirrorSelector.java
index 6fa2c55..adb562a 100644
--- 
a/maven-compat/src/main/java/org/apache/maven/repository/DefaultMirrorSelector.java
+++ 
b/maven-compat/src/main/java/org/apache/maven/repository/DefaultMirrorSelector.java
@@ -41,6 +41,8 @@ public class DefaultMirrorSelector
 
     private static final String EXTERNAL_WILDCARD = "external:*";
 
+    private static final String EXTERNAL_HTTP_WILDCARD = "external:http:*";
+
     public Mirror getMirror( ArtifactRepository repository, List<Mirror> 
mirrors )
     {
         String repoId = repository.getId();
@@ -68,9 +70,14 @@ public class DefaultMirrorSelector
     }
 
     /**
-     * This method checks if the pattern matches the originalRepository. Valid 
patterns: * =
-     * everything external:* = everything not on the localhost and not file 
based. repo,repo1 = repo
-     * or repo1 *,!repo1 = everything except repo1
+     * This method checks if the pattern matches the originalRepository. Valid 
patterns:
+     * <ul>
+     * <li>{@code *} = everything,</li>
+     * <li>{@code external:*} = everything not on the localhost and not file 
based,</li>
+     * <li>{@code external:http:*} = any repository not on the localhost using 
HTTP,</li>
+     * <li>{@code repo,repo1} = {@code repo} or {@code repo1},</li>
+     * <li>{@code *,!repo1} = everything except {@code repo1}.</li>
+     * </ul>
      *
      * @param originalRepository to compare for a match.
      * @param pattern used for match. Currently only '*' is supported.
@@ -115,6 +122,12 @@ public class DefaultMirrorSelector
                     result = true;
                     // don't stop processing in case a future segment 
explicitly excludes this repo
                 }
+                // check for external:http:*
+                else if ( EXTERNAL_HTTP_WILDCARD.equals( repo ) && 
isExternalHttpRepo( originalRepository ) )
+                {
+                    result = true;
+                    // don't stop processing in case a future segment 
explicitly excludes this repo
+                }
                 else if ( WILDCARD.equals( repo ) )
                 {
                     result = true;
@@ -136,8 +149,34 @@ public class DefaultMirrorSelector
         try
         {
             URL url = new URL( originalRepository.getUrl() );
-            return !( url.getHost().equals( "localhost" ) || 
url.getHost().equals( "127.0.0.1" )
-                            || url.getProtocol().equals( "file" ) );
+            return !( isLocal( url.getHost() ) || url.getProtocol().equals( 
"file" ) );
+        }
+        catch ( MalformedURLException e )
+        {
+            // bad url just skip it here. It should have been validated 
already, but the wagon lookup will deal with it
+            return false;
+        }
+    }
+
+    private static boolean isLocal( String host )
+    {
+        return "localhost".equals( host ) || "127.0.0.1".equals( host );
+    }
+
+    /**
+     * Checks the URL to see if this repository refers to a non-localhost 
repository using HTTP.
+     *
+     * @param originalRepository
+     * @return true if external.
+     */
+    static boolean isExternalHttpRepo( ArtifactRepository originalRepository )
+    {
+        try
+        {
+            URL url = new URL( originalRepository.getUrl() );
+            return ( "http".equalsIgnoreCase( url.getProtocol() ) || 
"dav".equalsIgnoreCase( url.getProtocol() )
+                || "dav:http".equalsIgnoreCase( url.getProtocol() )
+                || "dav+http".equalsIgnoreCase( url.getProtocol() ) ) && 
!isLocal( url.getHost() );
         }
         catch ( MalformedURLException e )
         {
@@ -146,7 +185,7 @@ public class DefaultMirrorSelector
         }
     }
 
-    static boolean matchesLayout( ArtifactRepository repository, Mirror mirror 
)
+   static boolean matchesLayout( ArtifactRepository repository, Mirror mirror )
     {
         return matchesLayout( RepositoryUtils.getLayout( repository ), 
mirror.getMirrorOfLayouts() );
     }
diff --git 
a/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java 
b/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java
index 730b428..90bfdcd 100644
--- 
a/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java
+++ 
b/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java
@@ -710,6 +710,8 @@ public class MavenRepositorySystem
 
     private static final String EXTERNAL_WILDCARD = "external:*";
 
+    private static final String EXTERNAL_HTTP_WILDCARD = "external:http:*";
+
     public static Mirror getMirror( ArtifactRepository repository, 
List<Mirror> mirrors )
     {
         String repoId = repository.getId();
@@ -737,8 +739,14 @@ public class MavenRepositorySystem
     }
 
     /**
-     * This method checks if the pattern matches the originalRepository. Valid 
patterns: * = everything external:* =
-     * everything not on the localhost and not file based. repo,repo1 = repo 
or repo1 *,!repo1 = everything except repo1
+     * This method checks if the pattern matches the originalRepository. Valid 
patterns:
+     * <ul>
+     * <li>{@code *} = everything,</li>
+     * <li>{@code external:*} = everything not on the localhost and not file 
based,</li>
+     * <li>{@code external:http:*} = any repository not on the localhost using 
HTTP,</li>
+     * <li>{@code repo,repo1} = {@code repo} or {@code repo1},</li>
+     * <li>{@code *,!repo1} = everything except {@code repo1}.</li>
+     * </ul>
      *
      * @param originalRepository to compare for a match.
      * @param pattern used for match. Currently only '*' is supported.
@@ -782,6 +790,12 @@ public class MavenRepositorySystem
                     result = true;
                     // don't stop processing in case a future segment 
explicitly excludes this repo
                 }
+                // check for external:http:*
+                else if ( EXTERNAL_HTTP_WILDCARD.equals( repo ) && 
isExternalHttpRepo( originalRepository ) )
+                {
+                    result = true;
+                    // don't stop processing in case a future segment 
explicitly excludes this repo
+                }
                 else if ( WILDCARD.equals( repo ) )
                 {
                     result = true;
@@ -803,8 +817,34 @@ public class MavenRepositorySystem
         try
         {
             URL url = new URL( originalRepository.getUrl() );
-            return !( url.getHost().equals( "localhost" ) || 
url.getHost().equals( "127.0.0.1" )
-                            || url.getProtocol().equals( "file" ) );
+            return !( isLocal( url.getHost() ) || url.getProtocol().equals( 
"file" ) );
+        }
+        catch ( MalformedURLException e )
+        {
+            // bad url just skip it here. It should have been validated 
already, but the wagon lookup will deal with it
+            return false;
+        }
+    }
+
+    private static boolean isLocal( String host )
+    {
+        return "localhost".equals( host ) || "127.0.0.1".equals( host );
+    }
+
+    /**
+     * Checks the URL to see if this repository refers to a non-localhost 
repository using HTTP.
+     *
+     * @param originalRepository
+     * @return true if external.
+     */
+    static boolean isExternalHttpRepo( ArtifactRepository originalRepository )
+    {
+        try
+        {
+            URL url = new URL( originalRepository.getUrl() );
+            return ( "http".equalsIgnoreCase( url.getProtocol() ) || 
"dav".equalsIgnoreCase( url.getProtocol() )
+                || "dav:http".equalsIgnoreCase( url.getProtocol() )
+                || "dav+http".equalsIgnoreCase( url.getProtocol() ) ) && 
!isLocal( url.getHost() );
         }
         catch ( MalformedURLException e )
         {

Reply via email to