diff --git a/maven-mboot2/src/main/java/MBoot.java b/maven-mboot2/src/main/java/MBoot.java
index 324ad8fa80..049cd4dc67 100644
--- a/maven-mboot2/src/main/java/MBoot.java
+++ b/maven-mboot2/src/main/java/MBoot.java
@@ -242,16 +242,44 @@ public class MBoot
online = false;
}
- Repository localRepository = new Repository( mavenRepoLocal, Repository.LAYOUT_DEFAULT );
+ Repository localRepository = new Repository( "local", mavenRepoLocal, Repository.LAYOUT_DEFAULT );
if ( online )
{
- downloader = new ArtifactDownloader( localRepository, Collections.EMPTY_LIST );
+ downloader = new ArtifactDownloader( localRepository );
if ( userModelReader.getActiveProxy() != null )
{
Proxy proxy = userModelReader.getActiveProxy();
downloader.setProxy( proxy.getHost(), proxy.getPort(), proxy.getUserName(), proxy.getPassword() );
}
+
+ List remoteRepos = downloader.getRemoteRepositories();
+ List newRemoteRepos = new ArrayList();
+
+ for ( Iterator i = remoteRepos.iterator(); i.hasNext(); )
+ {
+ Repository repo = (Repository) i.next();
+
+ boolean foundMirror = false;
+ for ( Iterator j = userModelReader.getMirrors().iterator(); j.hasNext() && !foundMirror; )
+ {
+ Mirror m = (Mirror) j.next();
+ if ( m.getMirrorOf().equals( repo.getId() ) )
+ {
+ newRemoteRepos.add( new Repository( m.getId(), m.getUrl(), repo.getLayout() ) );
+ foundMirror = true;
+ }
+ }
+ if ( !foundMirror )
+ {
+ newRemoteRepos.add( repo );
+ }
+ }
+
+ downloader.setRemoteRepositories( newRemoteRepos );
+
+ System.out.println( "Using the following for your local repository: " + localRepository );
+ System.out.println( "Using the following for your remote repository: " + newRemoteRepos );
}
String basedir = System.getProperty( "user.dir" );
@@ -948,6 +976,8 @@ public class MBoot
class SettingsReader
extends AbstractReader
{
+ private List mirrors = new ArrayList();
+
private List profiles = new ArrayList();
private Profile currentProfile = null;
@@ -962,6 +992,8 @@ public class MBoot
private Proxy activeProxy = null;
+ private Mirror currentMirror;
+
public Profile getActiveProfile()
{
return activeProfile;
@@ -1018,7 +1050,7 @@ public class MBoot
}
else
{
- throw new SAXException( "Invalid proxy entry. Missing one or more " + "fields: {host, port}." );
+ throw new SAXException( "Invalid proxy entry. Missing one or more fields: {host, port}." );
}
}
else if ( currentProxy != null )
@@ -1054,6 +1086,41 @@ public class MBoot
throw new SAXException( "Illegal element inside proxy: \'" + rawName + "\'" );
}
}
+ else if ( "mirror".equals( rawName ) )
+ {
+ if ( notEmpty( currentMirror.getId() ) && notEmpty( currentMirror.getMirrorOf() ) &&
+ notEmpty( currentMirror.getUrl() ) )
+ {
+ mirrors.add( currentMirror );
+ currentMirror = null;
+ }
+ else
+ {
+ throw new SAXException( "Invalid mirror entry. Missing one or more fields: {id, mirrorOf, url}." );
+ }
+ }
+ else if ( currentMirror != null )
+ {
+ if ( "id".equals( rawName ) )
+ {
+ currentMirror.setId( currentBody.toString().trim() );
+ }
+ else if ( "mirrorOf".equals( rawName ) )
+ {
+ currentMirror.setMirrorOf( currentBody.toString().trim() );
+ }
+ else if ( "url".equals( rawName ) )
+ {
+ currentMirror.setUrl( currentBody.toString().trim() );
+ }
+ else if ( "name".equals( rawName ) )
+ {
+ }
+ else
+ {
+ throw new SAXException( "Illegal element inside proxy: \'" + rawName + "\'" );
+ }
+ }
else if ( "settings".equals( rawName ) )
{
if ( profiles.size() == 1 )
@@ -1103,6 +1170,10 @@ public class MBoot
{
currentProxy = new Proxy();
}
+ else if ( "mirror".equals( rawName ) )
+ {
+ currentMirror = new Mirror();
+ }
}
public void reset()
@@ -1111,8 +1182,15 @@ public class MBoot
this.activeProfile = null;
this.activeProxy = null;
this.currentProfile = null;
+ this.currentMirror = null;
this.profiles.clear();
this.proxies.clear();
+ this.mirrors.clear();
+ }
+
+ public List getMirrors()
+ {
+ return mirrors;
}
}
@@ -1143,7 +1221,7 @@ public class MBoot
}
}
- public class Proxy
+ public static class Proxy
{
private boolean active;
@@ -1206,4 +1284,42 @@ public class MBoot
}
}
+ public static class Mirror
+ {
+ private String id;
+
+ private String mirrorOf;
+
+ private String url;
+
+ public String getId()
+ {
+ return id;
+ }
+
+ public void setId( String id )
+ {
+ this.id = id;
+ }
+
+ public void setMirrorOf( String mirrorOf )
+ {
+ this.mirrorOf = mirrorOf;
+ }
+
+ public void setUrl( String url )
+ {
+ this.url = url;
+ }
+
+ public String getMirrorOf()
+ {
+ return mirrorOf;
+ }
+
+ public String getUrl()
+ {
+ return url;
+ }
+ }
}
diff --git a/maven-mboot2/src/main/java/download/ArtifactDownloader.java b/maven-mboot2/src/main/java/download/ArtifactDownloader.java
index 6d555084b1..01f30e746f 100644
--- a/maven-mboot2/src/main/java/download/ArtifactDownloader.java
+++ b/maven-mboot2/src/main/java/download/ArtifactDownloader.java
@@ -9,19 +9,15 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashSet;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
-import java.util.HashMap;
import java.util.Map;
public class ArtifactDownloader
{
public static final String SNAPSHOT_SIGNATURE = "-SNAPSHOT";
- private List remoteRepos;
-
private boolean useTimestamp = true;
private boolean ignoreErrors = false;
@@ -40,11 +36,11 @@ public class ArtifactDownloader
private Map downloadedArtifacts = new HashMap();
- public ArtifactDownloader( Repository localRepository, List remoteRepositories )
+ private List remoteRepositories;
+
+ public ArtifactDownloader( Repository localRepository )
throws Exception
{
- setRemoteRepos( remoteRepositories );
-
if ( localRepository == null )
{
System.err.println( "local repository not specified" );
@@ -53,9 +49,6 @@ public class ArtifactDownloader
}
this.localRepository = localRepository;
-
- System.out.println( "Using the following for your local repository: " + localRepository );
- System.out.println( "Using the following for your remote repositories: " + remoteRepos );
}
public void setProxy( String host, String port, String userName, String password )
@@ -115,28 +108,11 @@ public class ArtifactDownloader
return dep.getVersion().indexOf( SNAPSHOT_SIGNATURE ) >= 0;
}
- private void setRemoteRepos( List repositories )
- {
- remoteRepos = new ArrayList();
-
- if ( repositories != null )
- {
- remoteRepos.addAll( repositories );
- }
-
- if ( repositories.isEmpty() )
- {
- // TODO: use super POM?
- Repository repository = new Repository( REPO_URL, Repository.LAYOUT_DEFAULT );
- remoteRepos.add( repository );
- }
- }
-
private boolean getRemoteArtifact( Dependency dep, File destinationFile )
{
boolean fileFound = false;
- for ( Iterator i = remoteRepos.iterator(); i.hasNext(); )
+ for ( Iterator i = getRemoteRepositories().iterator(); i.hasNext(); )
{
Repository remoteRepo = (Repository) i.next();
@@ -177,7 +153,8 @@ public class ArtifactDownloader
{
File file = localRepository.getMetadataFile( dep.getGroupId(), dep.getArtifactId(),
dep.getVersion(), dep.getType(),
- dep.getArtifactId() + "-" + dep.getResolvedVersion() + ".pom" );
+ dep.getArtifactId() + "-" + dep.getResolvedVersion() +
+ ".pom" );
file.getParentFile().mkdirs();
@@ -250,19 +227,6 @@ public class ArtifactDownloader
return filename.substring( 0, index ) + s;
}
- private String replace( String text, String repl, String with )
- {
- StringBuffer buf = new StringBuffer( text.length() );
- int start = 0, end = 0;
- while ( ( end = text.indexOf( repl, start ) ) != -1 )
- {
- buf.append( text.substring( start, end ) ).append( with );
- start = end + repl.length();
- }
- buf.append( text.substring( start ) );
- return buf.toString();
- }
-
private void log( String message )
{
System.out.println( message );
@@ -272,4 +236,25 @@ public class ArtifactDownloader
{
return localRepository;
}
+
+ public List getRemoteRepositories()
+ {
+ if ( remoteRepositories == null )
+ {
+ remoteRepositories = new ArrayList();
+ }
+
+ if ( remoteRepositories.isEmpty() )
+ {
+ // TODO: use super POM?
+ remoteRepositories.add( new Repository( "central", REPO_URL, Repository.LAYOUT_DEFAULT ) );
+ }
+
+ return remoteRepositories;
+ }
+
+ public void setRemoteRepositories( List remoteRepositories )
+ {
+ this.remoteRepositories = remoteRepositories;
+ }
}
diff --git a/maven-mboot2/src/main/java/model/ModelReader.java b/maven-mboot2/src/main/java/model/ModelReader.java
index 0effa25571..29221f653f 100644
--- a/maven-mboot2/src/main/java/model/ModelReader.java
+++ b/maven-mboot2/src/main/java/model/ModelReader.java
@@ -312,7 +312,11 @@ public class ModelReader
}
else if ( insideRepository )
{
- if ( rawName.equals( "url" ) )
+ if ( rawName.equals( "id" ) )
+ {
+ currentRepository.setId( getBodyText() );
+ }
+ else if ( rawName.equals( "url" ) )
{
currentRepository.setBasedir( getBodyText() );
}
diff --git a/maven-mboot2/src/main/java/model/Repository.java b/maven-mboot2/src/main/java/model/Repository.java
index 542dca5109..8068ef9ed8 100644
--- a/maven-mboot2/src/main/java/model/Repository.java
+++ b/maven-mboot2/src/main/java/model/Repository.java
@@ -34,12 +34,15 @@ public class Repository
private String layout;
+ private String id;
+
public Repository()
{
}
- public Repository( String basedir, String layout )
+ public Repository( String id, String basedir, String layout )
{
+ this.id = id;
this.basedir = basedir;
this.layout = layout;
}
@@ -135,4 +138,18 @@ public class Repository
this.layout = layout;
}
+ public String getId()
+ {
+ return id;
+ }
+
+ public void setId( String id )
+ {
+ this.id = id;
+ }
+
+ public String getLayout()
+ {
+ return layout;
+ }
}
diff --git a/maven-settings/settings.mdo b/maven-settings/settings.mdo
index 94de91d20e..4d40aa1385 100644
--- a/maven-settings/settings.mdo
+++ b/maven-settings/settings.mdo
@@ -61,6 +61,17 @@
*
+
+ mirrors
+ 1.0.0
+
+ Configuration of download mirrors for repositories.
+
+
+ Mirror
+ *
+
+
profiles
1.0.0
@@ -348,5 +359,61 @@
+
+ Mirror
+ 1.0.0
+
+ A download mirror for a given repository.
+
+
+
+ id
+ true
+ 1.0.0
+ String
+
+ The server ID of this mirror. This must -not- be the same as that of the repository you are mirroring.
+
+
+
+ mirrorOf
+ true
+ 1.0.0
+ String
+
+ The server ID of the repository being mirrored, eg "central".
+
+
+
+ name
+ false
+ 1.0.0
+ String
+
+ The optional name that describes the mirror.
+
+
+
+ url
+ true
+ 1.0.0
+ String
+
+ The URL of the mirror repository.
+
+
+
+
+
-
\ No newline at end of file
+