Refactored the bootstrapper to use a proper Model

and inheritance/dependency chains so repositories defined in models
are used for metadata too. Previously they got lost because of all
the cloning.


git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@420408 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Kenney Westerhof 2006-07-10 03:31:30 +00:00
parent 9d9bfefdfa
commit c7c6b5d7c7
9 changed files with 561 additions and 433 deletions

View File

@ -18,7 +18,7 @@ package org.apache.maven.bootstrap.installer;
import org.apache.maven.bootstrap.Bootstrap; import org.apache.maven.bootstrap.Bootstrap;
import org.apache.maven.bootstrap.model.Dependency; import org.apache.maven.bootstrap.model.Dependency;
import org.apache.maven.bootstrap.model.ModelReader; import org.apache.maven.bootstrap.model.Model;
import org.apache.maven.bootstrap.util.FileUtils; import org.apache.maven.bootstrap.util.FileUtils;
import org.apache.maven.bootstrap.util.SimpleArgumentParser; import org.apache.maven.bootstrap.util.SimpleArgumentParser;
import org.codehaus.plexus.util.Expand; import org.codehaus.plexus.util.Expand;
@ -29,15 +29,11 @@ import org.codehaus.plexus.util.cli.Commandline;
import org.codehaus.plexus.util.cli.WriterStreamConsumer; import org.codehaus.plexus.util.cli.WriterStreamConsumer;
import java.io.File; import java.io.File;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.Properties;
/** /**
* Main class for bootstrap module. * Main class for bootstrap module.
@ -121,7 +117,7 @@ public class BootstrapInstaller
bootstrapper.buildProject( new File( basedir ), true ); bootstrapper.buildProject( new File( basedir ), true );
ModelReader mavenCliModel = bootstrapper.getCachedModel( "org.apache.maven", "maven-cli" ); Model mavenCliModel = bootstrapper.getCachedModel( "org.apache.maven", "maven-cli" );
File installation = new File( basedir, "bootstrap/target/installation" ); File installation = new File( basedir, "bootstrap/target/installation" );
createInstallation( installation, mavenCliModel ); createInstallation( installation, mavenCliModel );
@ -225,7 +221,7 @@ public class BootstrapInstaller
} }
} }
private void createInstallation( File dir, ModelReader mavenCliModel ) private void createInstallation( File dir, Model mavenCliModel )
throws IOException, CommandLineException, InterruptedException throws IOException, CommandLineException, InterruptedException
{ {
FileUtils.deleteDirectory( dir ); FileUtils.deleteDirectory( dir );
@ -243,7 +239,7 @@ public class BootstrapInstaller
File bootDirectory = new File( coreDirectory, "boot" ); File bootDirectory = new File( coreDirectory, "boot" );
bootDirectory.mkdir(); bootDirectory.mkdir();
for ( Iterator i = mavenCliModel.getDependencies().iterator(); i.hasNext(); ) for ( Iterator i = mavenCliModel.getAllDependencies().iterator(); i.hasNext(); )
{ {
Dependency dep = (Dependency) i.next(); Dependency dep = (Dependency) i.next();

View File

@ -23,6 +23,7 @@ import org.apache.maven.bootstrap.download.OfflineArtifactResolver;
import org.apache.maven.bootstrap.download.OnlineArtifactDownloader; import org.apache.maven.bootstrap.download.OnlineArtifactDownloader;
import org.apache.maven.bootstrap.download.RepositoryMetadata; import org.apache.maven.bootstrap.download.RepositoryMetadata;
import org.apache.maven.bootstrap.model.Dependency; import org.apache.maven.bootstrap.model.Dependency;
import org.apache.maven.bootstrap.model.Model;
import org.apache.maven.bootstrap.model.ModelReader; import org.apache.maven.bootstrap.model.ModelReader;
import org.apache.maven.bootstrap.model.Plugin; import org.apache.maven.bootstrap.model.Plugin;
import org.apache.maven.bootstrap.model.Repository; import org.apache.maven.bootstrap.model.Repository;
@ -35,7 +36,6 @@ import org.apache.maven.bootstrap.util.JarMojo;
import org.apache.maven.bootstrap.util.SimpleArgumentParser; import org.apache.maven.bootstrap.util.SimpleArgumentParser;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -58,6 +58,8 @@ import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import javax.xml.parsers.ParserConfigurationException;
/** /**
* Main class for bootstrap module. * Main class for bootstrap module.
* *
@ -136,7 +138,7 @@ public class Bootstrap
String basedir = System.getProperty( "user.dir" ); String basedir = System.getProperty( "user.dir" );
File pom = new File( basedir, "pom.xml" ); File pom = new File( basedir, "pom.xml" );
ModelReader reader = readModel( resolver, pom, true ); Model reader = readModel( resolver, pom, true );
File jar = buildProject( reader ); File jar = buildProject( reader );
if ( "install".equals( goal ) ) if ( "install".equals( goal ) )
@ -144,7 +146,7 @@ public class Bootstrap
install( reader, pom, jar ); install( reader, pom, jar );
} }
for ( Iterator i = reader.getDependencies().iterator(); i.hasNext(); ) for ( Iterator i = reader.getAllDependencies().iterator(); i.hasNext(); )
{ {
Dependency dep = (Dependency) i.next(); Dependency dep = (Dependency) i.next();
@ -154,16 +156,16 @@ public class Bootstrap
stats( fullStart, new Date() ); stats( fullStart, new Date() );
} }
private void install( ModelReader reader, File pom, File jar ) private void install( Model model, File pom, File jar )
throws Exception throws Exception
{ {
String artifactId = reader.getArtifactId(); String artifactId = model.getArtifactId();
String version = reader.getVersion(); String version = model.getVersion();
String groupId = reader.getGroupId(); String groupId = model.getGroupId();
String type = reader.getPackaging(); String type = model.getPackaging();
Repository localRepository = resolver.getLocalRepository(); Repository localRepository = resolver.getLocalRepository();
File file = localRepository.getArtifactFile( File file = localRepository.getArtifactFile(
@ -173,7 +175,7 @@ public class Bootstrap
FileUtils.copyFile( jar, file ); FileUtils.copyFile( jar, file );
installPomFile( reader, pom ); installPomFile( model, pom );
RepositoryMetadata metadata = new RepositoryMetadata(); RepositoryMetadata metadata = new RepositoryMetadata();
metadata.setReleaseVersion( version ); metadata.setReleaseVersion( version );
@ -188,17 +190,17 @@ public class Bootstrap
metadata.write( file ); metadata.write( file );
} }
private void installPomFile( ModelReader reader, File source ) private void installPomFile( Model model, File source )
throws IOException throws IOException
{ {
String artifactId = reader.getArtifactId(); String artifactId = model.getArtifactId();
String version = reader.getVersion(); String version = model.getVersion();
String groupId = reader.getGroupId(); String groupId = model.getGroupId();
Repository localRepository = resolver.getLocalRepository(); Repository localRepository = resolver.getLocalRepository();
File pom = localRepository.getMetadataFile( groupId, artifactId, version, reader.getPackaging(), File pom = localRepository.getMetadataFile( groupId, artifactId, version, model.getPackaging(),
artifactId + "-" + version + ".pom" ); artifactId + "-" + version + ".pom" );
System.out.println( "Installing POM: " + pom ); System.out.println( "Installing POM: " + pom );
@ -209,9 +211,9 @@ public class Bootstrap
private void cacheModels( File basedir, ArtifactResolver resolver ) private void cacheModels( File basedir, ArtifactResolver resolver )
throws IOException, ParserConfigurationException, SAXException throws IOException, ParserConfigurationException, SAXException
{ {
ModelReader reader = readModel( resolver, new File( basedir, "pom.xml" ), false ); Model model = readModel( resolver, new File( basedir, "pom.xml" ), false );
for ( Iterator i = reader.getModules().iterator(); i.hasNext(); ) for ( Iterator i = model.getModules().iterator(); i.hasNext(); )
{ {
String module = (String) i.next(); String module = (String) i.next();
@ -232,19 +234,19 @@ public class Bootstrap
File file = new File( basedir, "pom.xml" ); File file = new File( basedir, "pom.xml" );
ModelReader reader = readModel( resolver, file, true ); Model model = readModel( resolver, file, true );
String key = reader.getGroupId() + ":" + reader.getArtifactId() + ":" + reader.getPackaging(); String key = model.getGroupId() + ":" + model.getArtifactId() + ":" + model.getPackaging();
if ( inProgress.contains( key ) ) if ( inProgress.contains( key ) )
{ {
return; return;
} }
if ( reader.getPackaging().equals( "pom" ) ) if ( model.getPackaging().equals( "pom" ) )
{ {
if ( buildModules ) if ( buildModules )
{ {
for ( Iterator i = reader.getModules().iterator(); i.hasNext(); ) for ( Iterator i = model.getModules().iterator(); i.hasNext(); )
{ {
String module = (String) i.next(); String module = (String) i.next();
@ -262,15 +264,15 @@ public class Bootstrap
return; return;
} }
buildProject( reader ); buildProject( model );
inProgress.remove( key ); inProgress.remove( key );
} }
private File buildProject( ModelReader reader ) private File buildProject( Model model )
throws Exception throws Exception
{ {
File basedir = reader.getProjectFile().getParentFile(); File basedir = model.getProjectFile().getParentFile();
String sources = new File( basedir, "src/main/java" ).getAbsolutePath(); String sources = new File( basedir, "src/main/java" ).getAbsolutePath();
@ -283,11 +285,11 @@ public class Bootstrap
System.out.println( "Analysing dependencies ..." ); System.out.println( "Analysing dependencies ..." );
for ( Iterator i = reader.getDependencies().iterator(); i.hasNext(); ) for ( Iterator i = model.getAllDependencies().iterator(); i.hasNext(); )
{ {
Dependency dep = (Dependency) i.next(); Dependency dep = (Dependency) i.next();
dep.getRepositories().addAll( reader.getRemoteRepositories() ); dep.getRepositories().addAll( model.getRepositories() );
if ( modelFileCache.containsKey( dep.getId() ) ) if ( modelFileCache.containsKey( dep.getId() ) )
{ {
@ -295,7 +297,7 @@ public class Bootstrap
} }
} }
resolver.downloadDependencies( reader.getDependencies() ); resolver.downloadDependencies( model.getAllDependencies() );
System.out.println(); System.out.println();
System.out.println(); System.out.println();
@ -312,11 +314,11 @@ public class Bootstrap
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
File generatedSourcesDirectory = null; File generatedSourcesDirectory = null;
if ( reader.getPlugins().containsKey( MODELLO_PLUGIN_ID ) ) if ( model.getPlugins().containsKey( MODELLO_PLUGIN_ID ) )
{ {
Plugin plugin = (Plugin) reader.getPlugins().get( MODELLO_PLUGIN_ID ); Plugin plugin = (Plugin) model.getPlugins().get( MODELLO_PLUGIN_ID );
File model = new File( basedir, (String) plugin.getConfiguration().get( "model" ) ); File modelFile = new File( basedir, (String) plugin.getConfiguration().get( "model" ) );
System.out.println( "Model exists!" ); System.out.println( "Model exists!" );
@ -337,10 +339,10 @@ public class Bootstrap
Dependency dependency = plugin.asDependencyPom(); Dependency dependency = plugin.asDependencyPom();
resolver.downloadDependencies( Collections.singletonList( dependency ) ); resolver.downloadDependencies( Collections.singletonList( dependency ) );
File artifactFile = resolver.getArtifactFile( dependency ); File artifactFile = resolver.getArtifactFile( dependency );
ModelReader pluginReader = readModel( resolver, artifactFile, true ); Model pluginReader = readModel( resolver, artifactFile, true );
List dependencies = new ArrayList(); List dependencies = new ArrayList();
for ( Iterator i = pluginReader.getDependencies().iterator(); i.hasNext(); ) for ( Iterator i = pluginReader.getAllDependencies().iterator(); i.hasNext(); )
{ {
Dependency d = (Dependency) i.next(); Dependency d = (Dependency) i.next();
if ( !d.getGroupId().equals( "org.apache.maven" ) ) if ( !d.getGroupId().equals( "org.apache.maven" ) )
@ -353,11 +355,11 @@ public class Bootstrap
System.out.println( "Generating model bindings for version \'" + modelVersion + "\' from '" + model + "'" ); System.out.println( "Generating model bindings for version \'" + modelVersion + "\' from '" + model + "'" );
generateModelloSources( model.getAbsolutePath(), "java", generatedSourcesDirectory, modelVersion, "false", generateModelloSources( modelFile.getAbsolutePath(), "java", generatedSourcesDirectory, modelVersion, "false",
classLoader ); classLoader );
generateModelloSources( model.getAbsolutePath(), "xpp3-reader", generatedSourcesDirectory, modelVersion, generateModelloSources( modelFile.getAbsolutePath(), "xpp3-reader", generatedSourcesDirectory, modelVersion,
"false", classLoader ); "false", classLoader );
generateModelloSources( model.getAbsolutePath(), "xpp3-writer", generatedSourcesDirectory, modelVersion, generateModelloSources( modelFile.getAbsolutePath(), "xpp3-writer", generatedSourcesDirectory, modelVersion,
"false", classLoader ); "false", classLoader );
} }
@ -367,7 +369,7 @@ public class Bootstrap
System.out.println( "Compiling sources ..." ); System.out.println( "Compiling sources ..." );
compile( reader.getDependencies(), sources, classes, null, generatedSourcesDirectory, Dependency.SCOPE_COMPILE, compile( model.getAllDependencies(), sources, classes, null, generatedSourcesDirectory, Dependency.SCOPE_COMPILE,
resolver ); resolver );
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
@ -382,32 +384,32 @@ public class Bootstrap
// Create JAR // Create JAR
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
File jarFile = createJar( new File( basedir, "pom.xml" ), classes, buildDir, reader ); File jarFile = createJar( new File( basedir, "pom.xml" ), classes, buildDir, model );
System.out.println( "Packaging " + jarFile + " ..." ); System.out.println( "Packaging " + jarFile + " ..." );
resolver.addBuiltArtifact( reader.getGroupId(), reader.getArtifactId(), "jar", jarFile ); resolver.addBuiltArtifact( model.getGroupId(), model.getArtifactId(), "jar", jarFile );
line(); line();
return jarFile; return jarFile;
} }
private ModelReader readModel( ArtifactResolver resolver, File file, boolean resolveTransitiveDependencies ) private Model readModel( ArtifactResolver resolver, File file, boolean resolveTransitiveDependencies )
throws ParserConfigurationException, SAXException, IOException throws ParserConfigurationException, SAXException, IOException
{ {
ModelReader reader = new ModelReader( resolver, resolveTransitiveDependencies ); ModelReader reader = new ModelReader( resolver, resolveTransitiveDependencies );
reader.parse( file ); Model model = reader.parseModel( file, Collections.EMPTY_LIST );
resolver.addBuiltArtifact( reader.getGroupId(), reader.getArtifactId(), "pom", file ); resolver.addBuiltArtifact( model.getGroupId(), model.getArtifactId(), "pom", file );
String id = reader.getGroupId() + ":" + reader.getArtifactId(); String id = model.getGroupId() + ":" + model.getArtifactId();
modelFileCache.put( id, file ); modelFileCache.put( id, file );
modelCache.put( id, reader ); modelCache.put( id, model );
return reader; return model;
} }
private void line() private void line()
@ -415,7 +417,7 @@ public class Bootstrap
System.out.println( "------------------------------------------------------------------" ); System.out.println( "------------------------------------------------------------------" );
} }
private File createJar( File pomFile, String classes, String buildDir, ModelReader reader ) private File createJar( File pomFile, String classes, String buildDir, Model reader )
throws Exception throws Exception
{ {
JarMojo jarMojo = new JarMojo(); JarMojo jarMojo = new JarMojo();
@ -753,9 +755,9 @@ public class Bootstrap
return cl; return cl;
} }
public ModelReader getCachedModel( String groupId, String artifactId ) public Model getCachedModel( String groupId, String artifactId )
{ {
return (ModelReader) modelCache.get( groupId + ":" + artifactId ); return (Model) modelCache.get( groupId + ":" + artifactId );
} }
public File getArtifactFile( Dependency dep ) public File getArtifactFile( Dependency dep )

View File

@ -5,6 +5,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import org.apache.maven.bootstrap.model.Dependency; import org.apache.maven.bootstrap.model.Dependency;
import org.apache.maven.bootstrap.model.Model;
/* /*
* Copyright 2001-2005 The Apache Software Foundation. * Copyright 2001-2005 The Apache Software Foundation.
@ -49,7 +50,7 @@ public class DownloadFailedException
for ( Iterator it = dep.getChain().iterator(); it.hasNext(); ) for ( Iterator it = dep.getChain().iterator(); it.hasNext(); )
{ {
Dependency chainDep = (Dependency) it.next(); Model chainDep = (Model) it.next();
msg += "\n\t" + chainDep; msg += "\n\t" + chainDep;
repos.addAll( chainDep.getRepositories() ); repos.addAll( chainDep.getRepositories() );
} }

View File

@ -17,6 +17,7 @@ package org.apache.maven.bootstrap.download;
*/ */
import org.apache.maven.bootstrap.model.Dependency; import org.apache.maven.bootstrap.model.Dependency;
import org.apache.maven.bootstrap.model.Model;
import org.apache.maven.bootstrap.model.Repository; import org.apache.maven.bootstrap.model.Repository;
import org.apache.maven.bootstrap.util.FileUtils; import org.apache.maven.bootstrap.util.FileUtils;
import org.apache.maven.bootstrap.util.StringUtils; import org.apache.maven.bootstrap.util.StringUtils;
@ -129,7 +130,7 @@ public class OnlineArtifactDownloader
for ( Iterator i = dep.getChain().iterator(); i.hasNext(); ) for ( Iterator i = dep.getChain().iterator(); i.hasNext(); )
{ {
repositories.addAll( ( (Dependency) i.next() ).getRepositories() ); repositories.addAll( ( (Model) i.next() ).getRepositories() );
} }
for ( Iterator i = repositories.iterator(); i.hasNext(); ) for ( Iterator i = repositories.iterator(); i.hasNext(); )

View File

@ -16,8 +16,6 @@ package org.apache.maven.bootstrap.model;
* limitations under the License. * limitations under the License.
*/ */
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -27,22 +25,14 @@ import java.util.Set;
* *
* @version $Id$ * @version $Id$
*/ */
public class Dependency public class Dependency extends Model
{ {
private String id; private String id;
private String version;
private String url; private String url;
private String jar; private String jar;
private String artifactId;
private String groupId;
private String type = "jar";
private String scope = SCOPE_COMPILE; private String scope = SCOPE_COMPILE;
private String resolvedVersion; private String resolvedVersion;
@ -57,23 +47,18 @@ public class Dependency
private Set exclusions = new HashSet(); private Set exclusions = new HashSet();
private List chain;
private Collection repositories;
public Dependency( List chain ) public Dependency( List chain )
{ {
this.chain = new ArrayList( chain ); super(chain);
this.chain.add( this );
} }
public Dependency( String groupId, String artifactId, String version, String type, List chain ) public Dependency( String groupId, String artifactId, String version, String type, List chain )
{ {
this( chain ); this( chain );
this.version = version; setVersion( version );
this.artifactId = artifactId; setArtifactId( artifactId );
this.groupId = groupId; setGroupId( groupId );
this.type = type; setType( type );
} }
public void setId( String id ) public void setId( String id )
@ -91,16 +76,6 @@ public class Dependency
return id; return id;
} }
public void setGroupId( String groupId )
{
this.groupId = groupId;
}
public String getGroupId()
{
return groupId;
}
public String getArtifactDirectory() public String getArtifactDirectory()
{ {
if ( isValid( getGroupId() ) ) if ( isValid( getGroupId() ) )
@ -111,16 +86,6 @@ public class Dependency
return getId(); return getId();
} }
public String getArtifactId()
{
return artifactId;
}
public void setArtifactId( String artifactId )
{
this.artifactId = artifactId;
}
public String getArtifact() public String getArtifact()
{ {
// If the jar name has been explicty set then use that. This // If the jar name has been explicty set then use that. This
@ -152,16 +117,6 @@ public class Dependency
return artifact; return artifact;
} }
public void setVersion( String version )
{
this.version = version;
}
public String getVersion()
{
return version;
}
public void setJar( String jar ) public void setJar( String jar )
{ {
// This is a check we need because of the jelly interpolation // This is a check we need because of the jelly interpolation
@ -202,12 +157,12 @@ public class Dependency
public String getType() public String getType()
{ {
return type; return getPackaging();
} }
public void setType( String type ) public void setType( String type )
{ {
this.type = type; setPackaging( type );
} }
private boolean isValid( String value ) private boolean isValid( String value )
@ -216,61 +171,11 @@ public class Dependency
} }
public Collection getRepositories()
{
if ( repositories == null )
repositories = new ArrayList();
return repositories;
}
public String toString() public String toString()
{ {
return getId() + ":" + getVersion() + ":" + getType(); return "Dependency[" + getId() + ":" + getVersion() + ":" + getType() + "]";
} }
public int hashCode()
{
int result = 17;
result = 37 * result + groupId.hashCode();
result = 37 * result + artifactId.hashCode();
result = 37 * result + type.hashCode();
result = 37 * result + version.hashCode();
return result;
}
public boolean equals( Object o )
{
if ( o == this )
{
return true;
}
if ( !( o instanceof Dependency ) )
{
return false;
}
Dependency d = (Dependency) o;
if ( !d.getGroupId().equals( groupId ) )
{
return false;
}
else if ( !d.getArtifactId().equals( artifactId ) )
{
return false;
}
else if ( !d.getVersion().equals( version ) )
{
return false;
}
else if ( !d.getType().equals( type ) )
{
return false;
}
return true;
}
public String getConflictId() public String getConflictId()
{ {
@ -306,15 +211,10 @@ public class Dependency
return exclusions; return exclusions;
} }
public List getChain()
{
return chain;
}
public Dependency getPomDependency() public Dependency getPomDependency()
{ {
Dependency dep = new Dependency( groupId, artifactId, version, "pom", chain ); Dependency dep = new Dependency( getGroupId(), getArtifactId(), getVersion(), "pom", getChain() );
dep.repositories = repositories; dep.getRepositories().addAll( getRepositories() );
return dep; return dep;
} }
@ -327,4 +227,16 @@ public class Dependency
{ {
return optional; return optional;
} }
public boolean equals( Object o )
{
if ( o instanceof Dependency )
{
return super.equals( o );
}
else
{
return false;
}
}
} }

View File

@ -0,0 +1,260 @@
package org.apache.maven.bootstrap.model;
/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed 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.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Represents a Model.
*
* @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
*
*/
public class Model
{
private Map dependencies = new HashMap();
Map parentDependencies = new HashMap();
Map transitiveDependencies = new HashMap();
private Map plugins = new HashMap();
private String artifactId;
private String version;
private String groupId;
private String parentGroupId;
private String parentArtifactId;
private String parentVersion;
private String packaging = "jar";
private File pomFile;
private List modules = new ArrayList();
private List resources = new ArrayList();
private Set repositories = new HashSet();
Map managedDependencies = new HashMap();
private List chain;
public Model()
{
this.chain = new ArrayList();
}
public Model( List chain )
{
this.chain = new ArrayList( chain );
this.chain.add( this );
}
public String getId()
{
return groupId + ":" + artifactId + ":" + packaging + ":" + version;
}
public String getArtifactId()
{
return artifactId;
}
public void setArtifactId( String artifactId )
{
this.artifactId = artifactId;
}
public String getVersion()
{
return version;
}
public void setVersion( String version )
{
this.version = version;
}
public String getGroupId()
{
return groupId;
}
public void setGroupId( String groupId )
{
this.groupId = groupId;
}
public String getPackaging()
{
return packaging;
}
public String getParentArtifactId()
{
return parentArtifactId;
}
public void setParentArtifactId( String artifactId )
{
this.parentArtifactId = artifactId;
}
public void setPackaging( String packaging )
{
this.packaging = packaging;
}
public String getParentGroupId()
{
return parentGroupId;
}
public void setParentGroupId( String groupId )
{
this.parentGroupId = groupId;
}
public String getParentVersion()
{
return parentVersion;
}
public void setParentVersion( String version )
{
this.parentVersion = version;
}
public Map getPlugins()
{
return plugins;
}
public List getModules()
{
return modules;
}
public List getResources()
{
return resources;
}
public File getProjectFile()
{
return pomFile;
}
public void setPomFile( File file )
{
this.pomFile = file;
}
public Set getRepositories()
{
return repositories;
}
public Collection getManagedDependencies()
{
Map m = new HashMap();
m.putAll( managedDependencies );
return m.values();
}
public Collection getAllDependencies()
{
Map m = new HashMap();
m.putAll( transitiveDependencies );
m.putAll( parentDependencies );
m.putAll( dependencies );
return m.values();
}
public List getChain()
{
return chain;
}
public Map getDependencies()
{
return dependencies;
}
public String toString()
{
return "Model[" + getId() + "]";
}
public int hashCode()
{
int result = 17;
result = 37 * result + groupId.hashCode();
result = 37 * result + artifactId.hashCode();
result = 37 * result + packaging.hashCode();
result = 37 * result + version.hashCode();
return result;
}
public boolean equals( Object o )
{
if ( o == this )
{
return true;
}
if ( !( o instanceof Model ) )
{
return false;
}
Model d = (Model) o;
if ( !d.getGroupId().equals( groupId ) )
{
return false;
}
else if ( !d.getArtifactId().equals( artifactId ) )
{
return false;
}
else if ( !d.getVersion().equals( version ) )
{
return false;
}
else if ( !d.getPackaging().equals( packaging ) )
{
return false;
}
return true;
}
}

View File

@ -17,22 +17,16 @@ package org.apache.maven.bootstrap.model;
*/ */
import org.apache.maven.bootstrap.download.ArtifactResolver; import org.apache.maven.bootstrap.download.ArtifactResolver;
import org.apache.maven.bootstrap.download.DownloadFailedException;
import org.apache.maven.bootstrap.util.AbstractReader; import org.apache.maven.bootstrap.util.AbstractReader;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
/** /**
@ -45,27 +39,7 @@ public class ModelReader
{ {
private int depth = 0; private int depth = 0;
private String artifactId; private Model model;
private String version;
private String groupId;
private String packaging = "jar";
private String parentGroupId;
private String parentArtifactId;
private String parentVersion;
private Map dependencies = new HashMap();
private List repositories = new ArrayList();
private List resources = new ArrayList();
private Map managedDependencies = new HashMap();
private Dependency currentDependency; private Dependency currentDependency;
@ -87,12 +61,6 @@ public class ModelReader
private final ArtifactResolver resolver; private final ArtifactResolver resolver;
private static Set inProgress = new HashSet();
private Map parentDependencies = new HashMap();
private Map transitiveDependencies = new HashMap();
private boolean insideDependencyManagement = false; private boolean insideDependencyManagement = false;
private boolean insideReleases; private boolean insideReleases;
@ -105,12 +73,8 @@ public class ModelReader
private final Set excluded; private final Set excluded;
private final List chain;
private final String inheritedScope; private final String inheritedScope;
private Map plugins = new HashMap();
private boolean insideConfiguration; private boolean insideConfiguration;
private boolean insideBuild; private boolean insideBuild;
@ -119,15 +83,13 @@ public class ModelReader
private boolean insidePlugin; private boolean insidePlugin;
private List modules = new ArrayList();
public ModelReader( ArtifactResolver resolver, boolean resolveTransitiveDependencies ) public ModelReader( ArtifactResolver resolver, boolean resolveTransitiveDependencies )
{ {
this( resolver, null, resolveTransitiveDependencies, Collections.EMPTY_SET, Collections.EMPTY_LIST ); this( resolver, null, resolveTransitiveDependencies, Collections.EMPTY_SET );
} }
public ModelReader( ArtifactResolver resolver, String inheritedScope, boolean resolveTransitiveDependencies, public ModelReader( ArtifactResolver resolver, String inheritedScope, boolean resolveTransitiveDependencies,
Set excluded, List chain ) Set excluded )
{ {
this.resolver = resolver; this.resolver = resolver;
@ -136,34 +98,17 @@ public class ModelReader
this.excluded = excluded; this.excluded = excluded;
this.inheritedScope = inheritedScope; this.inheritedScope = inheritedScope;
this.chain = chain;
} }
public List getRemoteRepositories() public Model parseModel( File file, List chain )
throws ParserConfigurationException, SAXException, IOException
{ {
return repositories; this.model = new Model( chain );
} model.setPomFile( file );
public Collection getDependencies() super.parse( file );
{
Map m = new HashMap();
m.putAll( transitiveDependencies );
m.putAll( parentDependencies );
m.putAll( dependencies );
return m.values();
}
public Collection getManagedDependencies() return model;
{
Map m = new HashMap();
m.putAll( managedDependencies );
return m.values();
}
public List getResources()
{
return resources;
} }
public void startElement( String uri, String localName, String rawName, Attributes attributes ) public void startElement( String uri, String localName, String rawName, Attributes attributes )
@ -180,9 +125,9 @@ public class ModelReader
} }
else if ( rawName.equals( "dependency" ) ) else if ( rawName.equals( "dependency" ) )
{ {
List newChain = // List newChain = Collections.singletonList( new Dependency( model.getGroupId(), model.getArtifactId(), model
Collections.singletonList( new Dependency( groupId, artifactId, version, packaging, this.chain ) ); // .getVersion(), model.getPackaging(), this.chain ) );
currentDependency = new Dependency( newChain ); currentDependency = new Dependency( model.getChain() );
insideDependency = true; insideDependency = true;
} }
@ -249,42 +194,42 @@ public class ModelReader
// support both v3 <extend> and v4 <parent> // support both v3 <extend> and v4 <parent>
if ( rawName.equals( "parent" ) ) if ( rawName.equals( "parent" ) )
{ {
if ( parentArtifactId == null || parentArtifactId.trim().length() == 0 ) if ( model.getParentArtifactId() == null || model.getParentArtifactId().trim().length() == 0 )
{ {
throw new SAXException( "Missing required element in <parent>: artifactId." ); throw new SAXException( "Missing required element in <parent>: artifactId." );
} }
if ( parentGroupId == null || parentGroupId.trim().length() == 0 ) if ( model.getParentGroupId() == null || model.getParentGroupId().trim().length() == 0 )
{ {
throw new SAXException( "Missing required element in <parent>: groupId." ); throw new SAXException( "Missing required element in <parent>: groupId." );
} }
if ( parentVersion == null || parentVersion.trim().length() == 0 ) if ( model.getParentVersion() == null || model.getParentVersion().trim().length() == 0 )
{ {
throw new SAXException( "Missing required element in <parent>: version." ); throw new SAXException( "Missing required element in <parent>: version." );
} }
if ( groupId == null ) if ( model.getGroupId() == null )
{ {
groupId = parentGroupId; model.setGroupId( model.getParentGroupId() );
} }
if ( version == null ) if ( model.getVersion() == null )
{ {
version = parentVersion; model.setVersion( model.getParentVersion() );
} }
// actually, these should be transtive (see MNG-77) - but some projects have circular deps that way // actually, these should be transtive (see MNG-77) - but some projects have circular deps that way
ModelReader p = retrievePom( parentGroupId, parentArtifactId, parentVersion, inheritedScope, false, Model p = ProjectResolver.retrievePom( resolver, model.getParentGroupId(), model.getParentArtifactId(),
excluded, Collections.EMPTY_LIST ); model.getParentVersion(), inheritedScope, false, excluded, model.getChain() );//Collections.singletonList( model ) );
addDependencies( p.getDependencies(), parentDependencies, inheritedScope, excluded ); ProjectResolver.addDependencies( p.getAllDependencies(), model.parentDependencies, inheritedScope, excluded );
addDependencies( p.getManagedDependencies(), managedDependencies, inheritedScope, Collections.EMPTY_SET ); ProjectResolver.addDependencies( p.getManagedDependencies(), model.managedDependencies, inheritedScope, Collections.EMPTY_SET );
repositories.addAll( p.getRemoteRepositories() ); model.getRepositories().addAll( p.getRepositories() );
resources.addAll( p.getResources() ); model.getResources().addAll( p.getResources() );
insideParent = false; insideParent = false;
} }
@ -294,11 +239,11 @@ public class ModelReader
if ( insideDependencyManagement ) if ( insideDependencyManagement )
{ {
managedDependencies.put( currentDependency.getConflictId(), currentDependency ); model.managedDependencies.put( currentDependency.getConflictId(), currentDependency );
} }
else else
{ {
dependencies.put( currentDependency.getConflictId(), currentDependency ); model.getDependencies().put( currentDependency.getConflictId(), currentDependency );
} }
} }
else if ( rawName.equals( "exclusion" ) ) else if ( rawName.equals( "exclusion" ) )
@ -312,19 +257,19 @@ public class ModelReader
} }
else if ( rawName.equals( "resource" ) ) else if ( rawName.equals( "resource" ) )
{ {
resources.add( currentResource ); model.getResources().add( currentResource );
insideResource = false; insideResource = false;
} }
else if ( rawName.equals( "repository" ) ) else if ( rawName.equals( "repository" ) )
{ {
repositories.add( currentRepository ); model.getRepositories().add( currentRepository );
insideRepository = false; insideRepository = false;
} }
else if ( rawName.equals( "plugin" ) ) else if ( rawName.equals( "plugin" ) )
{ {
plugins.put( currentPlugin.getId(), currentPlugin ); model.getPlugins().put( currentPlugin.getId(), currentPlugin );
insidePlugin = false; insidePlugin = false;
} }
@ -334,21 +279,21 @@ public class ModelReader
} }
else if ( rawName.equals( "module" ) ) else if ( rawName.equals( "module" ) )
{ {
modules.add( getBodyText() ); model.getModules().add( getBodyText() );
} }
else if ( insideParent ) else if ( insideParent )
{ {
if ( rawName.equals( "groupId" ) ) if ( rawName.equals( "groupId" ) )
{ {
parentGroupId = getBodyText(); model.setParentGroupId( getBodyText() );
} }
else if ( rawName.equals( "artifactId" ) ) else if ( rawName.equals( "artifactId" ) )
{ {
parentArtifactId = getBodyText(); model.setParentArtifactId( getBodyText() );
} }
else if ( rawName.equals( "version" ) ) else if ( rawName.equals( "version" ) )
{ {
parentVersion = getBodyText(); model.setParentVersion( getBodyText() );
} }
} }
else if ( insideDependency ) else if ( insideDependency )
@ -476,27 +421,27 @@ public class ModelReader
{ {
if ( rawName.equals( "artifactId" ) ) if ( rawName.equals( "artifactId" ) )
{ {
artifactId = getBodyText(); model.setArtifactId( getBodyText() );
} }
else if ( rawName.equals( "version" ) ) else if ( rawName.equals( "version" ) )
{ {
version = getBodyText(); model.setVersion( getBodyText() );
} }
else if ( rawName.equals( "groupId" ) ) else if ( rawName.equals( "groupId" ) )
{ {
groupId = getBodyText(); model.setGroupId( getBodyText() );
} }
else if ( rawName.equals( "packaging" ) ) else if ( rawName.equals( "packaging" ) )
{ {
packaging = getBodyText(); model.setPackaging( getBodyText() );
} }
} }
if ( depth == 1 ) // model / project if ( depth == 1 ) // model / project
{ {
resolver.addBuiltArtifact( groupId, artifactId, "pom", pomFile ); resolver.addBuiltArtifact( model.getGroupId(), model.getArtifactId(), "pom", model.getProjectFile() );
resolveDependencies(); ProjectResolver.resolveDependencies( resolver, model, resolveTransitiveDependencies, inheritedScope, excluded );
} }
bodyText = new StringBuffer(); bodyText = new StringBuffer();
@ -504,170 +449,4 @@ public class ModelReader
depth--; depth--;
} }
private void resolveDependencies()
throws SAXException
{
for ( Iterator it = dependencies.values().iterator(); it.hasNext(); )
{
Dependency dependency = (Dependency) it.next();
if ( !excluded.contains( dependency.getConflictId() ) && !dependency.isOptional() )
{
if ( !dependency.getScope().equals( Dependency.SCOPE_TEST ) || inheritedScope == null )
{
if ( dependency.getVersion() == null )
{
Dependency managedDependency =
(Dependency) managedDependencies.get( dependency.getConflictId() );
if ( managedDependency == null )
{
throw new NullPointerException( "[" + groupId + ":" + artifactId + ":" + packaging + ":" +
version + "] " + "Dependency " + dependency.getConflictId() +
" is missing a version, and nothing is found in dependencyManagement. " );
}
dependency.setVersion( managedDependency.getVersion() );
}
if ( resolveTransitiveDependencies )
{
Set excluded = new HashSet( this.excluded );
excluded.addAll( dependency.getExclusions() );
ModelReader p = retrievePom( dependency.getGroupId(), dependency.getArtifactId(),
dependency.getVersion(), dependency.getScope(),
resolveTransitiveDependencies, excluded, dependency.getChain() );
addDependencies( p.getDependencies(), transitiveDependencies, dependency.getScope(), excluded );
}
}
}
}
}
private void addDependencies( Collection dependencies, Map target, String inheritedScope, Set excluded )
{
for ( Iterator i = dependencies.iterator(); i.hasNext(); )
{
Dependency d = (Dependency) i.next();
// skip test deps
if ( !Dependency.SCOPE_TEST.equals( d.getScope() ) )
{
// Do we care about runtime here?
if ( Dependency.SCOPE_TEST.equals( inheritedScope ) )
{
d.setScope( Dependency.SCOPE_TEST );
}
if ( !hasDependency( d, target ) && !excluded.contains( d.getConflictId() ) && !d.isOptional() )
{
if ( !"plexus".equals( d.getGroupId() ) || ( !"plexus-utils".equals( d.getArtifactId() ) &&
!"plexus-container-default".equals( d.getArtifactId() ) ) )
{
target.put( d.getConflictId(), d );
}
}
}
}
}
private boolean hasDependency( Dependency d, Map dependencies )
{
String conflictId = d.getConflictId();
if ( dependencies.containsKey( conflictId ) )
{
// We only care about pushing in compile scope dependencies I think
// if not, we'll need to be able to get the original and pick the appropriate scope
if ( d.getScope().equals( Dependency.SCOPE_COMPILE ) )
{
dependencies.remove( conflictId );
}
else
{
return true;
}
}
return false;
}
private ModelReader retrievePom( String groupId, String artifactId, String version, String inheritedScope,
boolean resolveTransitiveDependencies, Set excluded, List chain )
throws SAXException
{
String key = groupId + ":" + artifactId + ":" + version;
if ( inProgress.contains( key ) )
{
throw new SAXException( "Circular dependency found, looking for " + key + "\nIn progress:" + inProgress );
}
inProgress.add( key );
ModelReader p = new ModelReader( resolver, inheritedScope, resolveTransitiveDependencies, excluded, chain );
try
{
Dependency pom = new Dependency( groupId, artifactId, version, "pom", chain );
pom.getRepositories().addAll( repositories );
for ( Iterator it = chain.iterator(); it.hasNext(); )
{
pom.getRepositories().addAll( ( (Dependency) it.next() ).getRepositories() );
}
resolver.downloadDependencies( Collections.singletonList( pom ) );
p.parse( resolver.getArtifactFile( pom ) );
}
catch ( IOException e )
{
throw new SAXException( "Error getting parent POM", e );
}
catch ( ParserConfigurationException e )
{
throw new SAXException( "Error getting parent POM", e );
}
catch ( DownloadFailedException e )
{
throw new SAXException( "Error getting parent POM", e );
}
inProgress.remove( key );
return p;
}
public String getArtifactId()
{
return artifactId;
}
public String getVersion()
{
return version;
}
public String getGroupId()
{
return groupId;
}
public String getPackaging()
{
return packaging;
}
public Map getPlugins()
{
return plugins;
}
public List getModules()
{
return modules;
}
public File getProjectFile()
{
return pomFile;
}
} }

View File

@ -0,0 +1,181 @@
package org.apache.maven.bootstrap.model;
/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed 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 org.apache.maven.bootstrap.download.ArtifactResolver;
import org.apache.maven.bootstrap.download.DownloadFailedException;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
*
* Utility class for resolving Model dependencies.
*
*/
public final class ProjectResolver
{
private static Set inProgress = new HashSet();
private ProjectResolver()
{
}
public static void resolveDependencies( ArtifactResolver resolver, Model model,
boolean resolveTransitiveDependencies, String inheritedScope, Set excluded )
throws SAXException
{
for ( Iterator it = model.getDependencies().values().iterator(); it.hasNext(); )
{
Dependency dependency = (Dependency) it.next();
if ( !excluded.contains( dependency.getConflictId() ) && !dependency.isOptional() )
{
if ( !dependency.getScope().equals( Dependency.SCOPE_TEST ) || inheritedScope == null )
{
if ( dependency.getVersion() == null )
{
Dependency managedDependency = (Dependency) model.managedDependencies.get( dependency
.getConflictId() );
if ( managedDependency == null )
{
throw new NullPointerException( "[" + model.getId() + "] " + "Dependency "
+ dependency.getConflictId()
+ " is missing a version, and nothing is found in dependencyManagement. " );
}
dependency.setVersion( managedDependency.getVersion() );
}
if ( resolveTransitiveDependencies )
{
Set excluded2 = new HashSet( excluded );
excluded2.addAll( dependency.getExclusions() );
Model p = retrievePom( resolver, dependency.getGroupId(), dependency.getArtifactId(),
dependency.getVersion(), dependency.getScope(),
resolveTransitiveDependencies, excluded2, dependency.getChain() );
addDependencies( p.getAllDependencies(), model.transitiveDependencies, dependency.getScope(),
excluded2 );
}
}
}
}
}
public static void addDependencies( Collection dependencies, Map target, String inheritedScope, Set excluded )
{
for ( Iterator i = dependencies.iterator(); i.hasNext(); )
{
Dependency d = (Dependency) i.next();
// skip test deps
if ( !Dependency.SCOPE_TEST.equals( d.getScope() ) )
{
// Do we care about runtime here?
if ( Dependency.SCOPE_TEST.equals( inheritedScope ) )
{
d.setScope( Dependency.SCOPE_TEST );
}
if ( !hasDependency( d, target ) && !excluded.contains( d.getConflictId() ) && !d.isOptional() )
{
if ( !"plexus".equals( d.getGroupId() )
|| ( !"plexus-utils".equals( d.getArtifactId() ) && !"plexus-container-default".equals( d
.getArtifactId() ) ) )
{
target.put( d.getConflictId(), d );
}
}
}
}
}
private static boolean hasDependency( Dependency d, Map dependencies )
{
String conflictId = d.getConflictId();
if ( dependencies.containsKey( conflictId ) )
{
// We only care about pushing in compile scope dependencies I think
// if not, we'll need to be able to get the original and pick the appropriate scope
if ( d.getScope().equals( Dependency.SCOPE_COMPILE ) )
{
dependencies.remove( conflictId );
}
else
{
return true;
}
}
return false;
}
public static Model retrievePom( ArtifactResolver resolver, String groupId, String artifactId, String version,
String inheritedScope, boolean resolveTransitiveDependencies, Set excluded,
List chain )
throws SAXException
{
String key = groupId + ":" + artifactId + ":" + version;
if ( inProgress.contains( key ) )
{
throw new SAXException( "Circular dependency found, looking for " + key + "\nIn progress:" + inProgress );
}
inProgress.add( key );
ModelReader p = new ModelReader( resolver, inheritedScope, resolveTransitiveDependencies, excluded );
try
{
// download the POM
Dependency pom = new Dependency( groupId, artifactId, version, "pom", chain );
resolver.downloadDependencies( Collections.singletonList( pom ) );
// Parse the POM from the local repository into a model
Model model = p.parseModel( resolver.getArtifactFile( pom ), chain );
inProgress.remove( key );
return model;
}
catch ( IOException e )
{
throw new SAXException( "Error getting parent POM", e );
}
catch ( ParserConfigurationException e )
{
throw new SAXException( "Error getting parent POM", e );
}
catch ( DownloadFailedException e )
{
throw new SAXException( "Error getting parent POM", e );
}
}
}

View File

@ -40,13 +40,9 @@ public abstract class AbstractReader
{ {
private SAXParserFactory saxFactory; private SAXParserFactory saxFactory;
protected File pomFile;
public void parse( File file ) public void parse( File file )
throws ParserConfigurationException, SAXException, IOException throws ParserConfigurationException, SAXException, IOException
{ {
pomFile = file;
saxFactory = SAXParserFactory.newInstance(); saxFactory = SAXParserFactory.newInstance();
SAXParser parser = saxFactory.newSAXParser(); SAXParser parser = saxFactory.newSAXParser();