You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ol...@apache.org on 2016/05/01 12:56:14 UTC

[12/50] [abbrv] maven-aether git commit: Refactored DefaultMirrorSelector

Refactored DefaultMirrorSelector


Project: http://git-wip-us.apache.org/repos/asf/maven-aether/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-aether/commit/6ef2c6e8
Tree: http://git-wip-us.apache.org/repos/asf/maven-aether/tree/6ef2c6e8
Diff: http://git-wip-us.apache.org/repos/asf/maven-aether/diff/6ef2c6e8

Branch: refs/heads/master
Commit: 6ef2c6e88c77250cca32b2af4eb019024f12b687
Parents: ad27342
Author: Benjamin Bentmann <be...@sonatype.com>
Authored: Sat May 31 16:46:14 2014 +0200
Committer: Benjamin Bentmann <be...@sonatype.com>
Committed: Sat May 31 16:46:14 2014 +0200

----------------------------------------------------------------------
 .../util/repository/DefaultMirrorSelector.java  | 235 ++++++++++---------
 1 file changed, 120 insertions(+), 115 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven-aether/blob/6ef2c6e8/aether-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java
----------------------------------------------------------------------
diff --git a/aether-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java b/aether-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java
index 9cb83ae..168ff52 100644
--- a/aether-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java
+++ b/aether-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2013 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,6 +11,8 @@
 package org.eclipse.aether.util.repository;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
@@ -33,23 +35,23 @@ public final class DefaultMirrorSelector
     /**
      * Adds the specified mirror to this selector.
      * 
-     * @param id The identifier of the mirror, must not be {@code null}.
-     * @param url The URL of the mirror, must not be {@code null}.
-     * @param type The content type of the mirror, must not be {@code null}.
+     * @param id The identifier of the mirror, may be {@code null}.
+     * @param url The URL of the mirror, may be {@code null}.
+     * @param type The content type of the mirror, may be {@code null}.
      * @param repositoryManager A flag whether the mirror is a repository manager or a simple server.
-     * @param mirrorOfIds The identifier(s) of remote repositories to mirror, must not be {@code null}. Multiple
-     *            identifiers can be separated by comma and additionally the wildcards "*" and "external:*" can be used
-     *            to match all (external) repositories, prefixing a repo id with an exclamation mark allows to express
-     *            an exclusion. For example "external:*,!central".
+     * @param mirrorOfIds The identifier(s) of remote repositories to mirror, may be {@code null}. Multiple identifiers
+     *            can be separated by comma (',') and additionally the wildcards "*" and "external:*" can be used to
+     *            match all (external) repositories, prefixing a repo id with an exclamation mark allows to express an
+     *            exclusion. For example "external:*,!central".
      * @param mirrorOfTypes The content type(s) of remote repositories to mirror, may be {@code null} or empty to match
-     *            any content type. Similar to the repo id specification, multiple types can be comma-separated, the
-     *            wildcard "*" and the "!" negation syntax are supported. For example "*,!p2".
+     *            any content type. Multiple types can be separated by comma (','), the wildcard "*" and the "!"
+     *            negation syntax are also supported. For example "*,!p2".
      * @return This selector for chaining, never {@code null}.
      */
     public DefaultMirrorSelector add( String id, String url, String type, boolean repositoryManager,
                                       String mirrorOfIds, String mirrorOfTypes )
     {
-        mirrors.add( new MirrorDef( id, url, type, repositoryManager, mirrorOfIds, mirrorOfTypes ) );
+        mirrors.add( new MirrorDef( id, url, type, repositoryManager, split( mirrorOfIds ), split( mirrorOfTypes ) ) );
 
         return this;
     }
@@ -83,14 +85,14 @@ public final class DefaultMirrorSelector
 
     private MirrorDef findMirror( RemoteRepository repository )
     {
-        String repoId = repository.getId();
-
-        if ( repoId != null && !mirrors.isEmpty() )
+        if ( !mirrors.isEmpty() )
         {
+            String repoId = repository.getId();
+            String repoType = repository.getContentType();
+
             for ( MirrorDef mirror : mirrors )
             {
-                if ( repoId.equals( mirror.mirrorOfIds ) && matchesType( repository.getContentType(),
-                                                                         mirror.mirrorOfTypes ) )
+                if ( mirror.idMatcher.isExactMatch( repoId ) && mirror.typeMatcher.isMatch( repoType ) )
                 {
                     return mirror;
                 }
@@ -98,8 +100,7 @@ public final class DefaultMirrorSelector
 
             for ( MirrorDef mirror : mirrors )
             {
-                if ( matchPattern( repository, mirror.mirrorOfIds ) && matchesType( repository.getContentType(),
-                                                                                    mirror.mirrorOfTypes ) )
+                if ( mirror.idMatcher.isMatch( repository ) && mirror.typeMatcher.isMatch( repoType ) )
                 {
                     return mirror;
                 }
@@ -109,131 +110,135 @@ public final class DefaultMirrorSelector
         return null;
     }
 
-    /**
-     * 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
-     * 
-     * @param repository to compare for a match.
-     * @param pattern used for match. Currently only '*' is supported.
-     * @return true if the repository is a match to this pattern.
-     */
-    static boolean matchPattern( RemoteRepository repository, String pattern )
+    static List<String> split( String list )
     {
-        boolean result = false;
-        String originalId = repository.getId();
+        List<String> tokens = null;
+        if ( list != null )
+        {
+            tokens = Arrays.asList( list.split( "," ) );
+        }
+        return tokens;
+    }
 
-        // simple checks first to short circuit processing below.
-        if ( WILDCARD.equals( pattern ) || pattern.equals( originalId ) )
+    static String[] clean( Collection<String> tokens )
+    {
+        List<String> cleaned = new ArrayList<String>();
+        if ( tokens != null )
         {
-            result = true;
+            for ( String token : tokens )
+            {
+                if ( token != null && token.length() > 0 )
+                {
+                    cleaned.add( token );
+                }
+            }
         }
-        else
+        return cleaned.toArray( new String[cleaned.size()] );
+    }
+
+    static final class IdMatcher
+    {
+
+        final String[] mirrorOfIds;
+
+        public IdMatcher( Collection<String> mirrorOfIds )
+        {
+            this.mirrorOfIds = clean( mirrorOfIds );
+        }
+
+        boolean isExactMatch( String repoId )
         {
-            // process the list
-            String[] repos = pattern.split( "," );
-            for ( String repo : repos )
+            return mirrorOfIds.length == 1 && mirrorOfIds[0].equals( repoId );
+        }
+
+        boolean isMatch( RemoteRepository repository )
+        {
+            boolean result = false;
+            if ( mirrorOfIds.length <= 0 )
+            {
+                result = false;
+            }
+            else
             {
-                // see if this is a negative match
-                if ( repo.length() > 1 && repo.startsWith( "!" ) )
+                String repoId = repository.getId();
+                for ( String mirrorOfId : mirrorOfIds )
                 {
-                    if ( repo.substring( 1 ).equals( originalId ) )
+                    if ( mirrorOfId.equals( repoId ) )
+                    {
+                        result = true;
+                        break;
+                    }
+                    else if ( mirrorOfId.startsWith( "!" ) && mirrorOfId.substring( 1 ).equals( repoId ) )
                     {
-                        // explicitly exclude. Set result and stop processing.
                         result = false;
                         break;
                     }
-                }
-                // check for exact match
-                else if ( repo.equals( originalId ) )
-                {
-                    result = true;
-                    break;
-                }
-                // check for external:*
-                else if ( EXTERNAL_WILDCARD.equals( repo ) && isExternalRepo( repository ) )
-                {
-                    result = true;
-                    // don't stop processing in case a future segment explicitly excludes this repo
-                }
-                else if ( WILDCARD.equals( repo ) )
-                {
-                    result = true;
-                    // don't stop processing in case a future segment explicitly excludes this repo
+                    else if ( EXTERNAL_WILDCARD.equals( mirrorOfId ) && isExternalRepo( repository ) )
+                    {
+                        result = true;
+                    }
+                    else if ( WILDCARD.equals( mirrorOfId ) )
+                    {
+                        result = true;
+                    }
                 }
             }
+            return result;
+        }
+
+        static boolean isExternalRepo( RemoteRepository repository )
+        {
+            boolean local =
+                "localhost".equals( repository.getHost() ) || "127.0.0.1".equals( repository.getHost() )
+                    || "file".equalsIgnoreCase( repository.getProtocol() );
+            return !local;
         }
-        return result;
-    }
 
-    /**
-     * Checks the URL to see if this repository refers to an external repository.
-     * 
-     * @param repository The repository to check, must not be {@code null}.
-     * @return {@code true} if external, {@code false} otherwise.
-     */
-    static boolean isExternalRepo( RemoteRepository repository )
-    {
-        boolean local =
-            "localhost".equals( repository.getHost() ) || "127.0.0.1".equals( repository.getHost() )
-                || "file".equalsIgnoreCase( repository.getProtocol() );
-        return !local;
     }
 
-    /**
-     * Checks whether the types configured for a mirror match with the type of the repository.
-     * 
-     * @param repoType The type of the repository, may be {@code null}.
-     * @param mirrorType The types supported by the mirror, may be {@code null}.
-     * @return {@code true} if the types associated with the mirror match the type of the original repository,
-     *         {@code false} otherwise.
-     */
-    static boolean matchesType( String repoType, String mirrorType )
+    static final class TypeMatcher
     {
-        boolean result = false;
 
-        // simple checks first to short circuit processing below.
-        if ( mirrorType == null || mirrorType.length() <= 0 || WILDCARD.equals( mirrorType ) )
-        {
-            result = true;
-        }
-        else if ( mirrorType.equals( repoType ) )
+        final String[] mirrorOfTypes;
+
+        public TypeMatcher( Collection<String> mirrorOfTypes )
         {
-            result = true;
+            this.mirrorOfTypes = clean( mirrorOfTypes );
         }
-        else
+
+        boolean isMatch( String repoType )
         {
-            // process the list
-            String[] layouts = mirrorType.split( "," );
-            for ( String layout : layouts )
+            boolean result = false;
+            if ( mirrorOfTypes.length <= 0 )
+            {
+                result = true;
+            }
+            else
             {
-                // see if this is a negative match
-                if ( layout.length() > 1 && layout.startsWith( "!" ) )
+                for ( String mirrorOfType : mirrorOfTypes )
                 {
-                    if ( layout.substring( 1 ).equals( repoType ) )
+                    if ( mirrorOfType.equals( repoType ) )
+                    {
+                        result = true;
+                        break;
+                    }
+                    else if ( mirrorOfType.startsWith( "!" ) && mirrorOfType.substring( 1 ).equals( repoType ) )
                     {
-                        // explicitly exclude. Set result and stop processing.
                         result = false;
                         break;
                     }
-                }
-                // check for exact match
-                else if ( layout.equals( repoType ) )
-                {
-                    result = true;
-                    break;
-                }
-                else if ( WILDCARD.equals( layout ) )
-                {
-                    result = true;
-                    // don't stop processing in case a future segment explicitly excludes this repo
+                    else if ( WILDCARD.equals( mirrorOfType ) )
+                    {
+                        result = true;
+                    }
                 }
             }
+            return result;
         }
 
-        return result;
     }
 
-    static class MirrorDef
+    static final class MirrorDef
     {
 
         final String id;
@@ -244,19 +249,19 @@ public final class DefaultMirrorSelector
 
         final boolean repositoryManager;
 
-        final String mirrorOfIds;
+        final IdMatcher idMatcher;
 
-        final String mirrorOfTypes;
+        final TypeMatcher typeMatcher;
 
-        public MirrorDef( String id, String url, String type, boolean repositoryManager, String mirrorOfIds,
-                          String mirrorOfTypes )
+        public MirrorDef( String id, String url, String type, boolean repositoryManager,
+                          Collection<String> mirrorOfIds, Collection<String> mirrorOfTypes )
         {
             this.id = id;
             this.url = url;
             this.type = type;
             this.repositoryManager = repositoryManager;
-            this.mirrorOfIds = mirrorOfIds;
-            this.mirrorOfTypes = mirrorOfTypes;
+            this.idMatcher = new IdMatcher( mirrorOfIds );
+            this.typeMatcher = new TypeMatcher( mirrorOfTypes );
         }
 
     }