[MNG-7116] add support for mirrorOf external:http:*

This commit is contained in:
Hervé Boutemy 2021-03-13 18:40:48 +01:00
parent e5f6634e17
commit fa79cb22e4
2 changed files with 89 additions and 10 deletions

View File

@ -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,7 @@ 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 )
{
@ -146,7 +158,34 @@ public class DefaultMirrorSelector
}
}
static boolean matchesLayout( ArtifactRepository repository, Mirror mirror )
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 )
{
// bad url just skip it here. It should have been validated already, but the wagon lookup will deal with it
return false;
}
}
static boolean matchesLayout( ArtifactRepository repository, Mirror mirror )
{
return matchesLayout( RepositoryUtils.getLayout( repository ), mirror.getMirrorOfLayouts() );
}

View File

@ -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 )
{