brett 2005/04/07 21:35:21
Modified: maven-core/src/main/java/org/apache/maven/artifact Tag:
MAVEN-2_0-ALPHA_1-branch MavenMetadataSource.java
maven-core/src/main/java/org/apache/maven/project Tag:
MAVEN-2_0-ALPHA_1-branch
DefaultMavenProjectBuilder.java
MavenProjectBuilder.java
Log:
refactor the project builder to make caching self contained and introduce
some more consistency
Revision Changes Path
No revision
No revision
1.26.2.1 +33 -46
maven-components/maven-core/src/main/java/org/apache/maven/artifact/MavenMetadataSource.java
Index: MavenMetadataSource.java
===================================================================
RCS file:
/home/cvs/maven-components/maven-core/src/main/java/org/apache/maven/artifact/MavenMetadataSource.java,v
retrieving revision 1.26
retrieving revision 1.26.2.1
diff -u -r1.26 -r1.26.2.1
--- MavenMetadataSource.java 6 Apr 2005 07:38:14 -0000 1.26
+++ MavenMetadataSource.java 8 Apr 2005 04:35:21 -0000 1.26.2.1
@@ -55,9 +55,6 @@
public MavenMetadataSource( ArtifactResolver artifactResolver )
{
- // there is code in plexus that uses this (though it shouldn't) so we
- // need to be able to not have a project builder
- // TODO: remove, then remove those null checks
this.artifactResolver = artifactResolver;
this.mavenProjectBuilder = null;
}
@@ -71,24 +68,32 @@
public Set retrieve( Artifact artifact, ArtifactRepository
localRepository, List remoteRepositories )
throws ArtifactMetadataRetrievalException
{
+ Artifact metadataArtifact = artifactFactory.createArtifact(
artifact.getGroupId(), artifact.getArtifactId(),
+
artifact.getBaseVersion(), artifact.getScope(),
+ "pom",
null );
+
List dependencies = null;
+ // Use the ProjectBuilder, to enable post-processing and inheritance
calculation before retrieving the
+ // associated artifacts.
if ( mavenProjectBuilder != null )
{
- Model model = mavenProjectBuilder.getCachedModel(
artifact.getGroupId(), artifact.getArtifactId(),
-
artifact.getVersion() );
- if ( model != null )
+ try
{
- dependencies = model.getDependencies();
+ MavenProject p = mavenProjectBuilder.buildFromRepository(
metadataArtifact, remoteRepositories,
+
localRepository );
+ dependencies = p.getDependencies();
+ }
+ catch ( ProjectBuildingException e )
+ {
+ throw new ArtifactMetadataRetrievalException( "Unable to
read the metadata file", e );
}
}
-
- if ( dependencies == null )
+ else
{
- Artifact metadataArtifact = artifactFactory.createArtifact(
artifact.getGroupId(),
-
artifact.getArtifactId(),
-
artifact.getBaseVersion(), artifact.getScope(),
-
"pom", null );
+ // there is code in plexus that uses this (though it shouldn't)
so we
+ // need to be able to not have a project builder
+ // TODO: remove - which then makes this a very thin wrapper
around a project builder - is it needed?
try
{
@@ -99,38 +104,20 @@
throw new ArtifactMetadataRetrievalException( "Error while
resolving metadata artifact", e );
}
- // [jdcasey/03-Feb-2005]: Replacing with ProjectBuilder, to
enable
- // post-processing and inheritance calculation before retrieving
the
- // associated artifacts. This should improve consistency.
- if ( mavenProjectBuilder != null )
- {
- try
- {
- MavenProject p =
mavenProjectBuilder.buildFromRepository( metadataArtifact, localRepository );
- dependencies = p.getDependencies();
- }
- catch ( ProjectBuildingException e )
- {
- throw new ArtifactMetadataRetrievalException( "Unable to
read the metadata file", e );
- }
- }
- else
- {
- FileReader reader = null;
- try
- {
- reader = new FileReader( metadataArtifact.getFile() );
- Model model = this.reader.read( reader );
- dependencies = model.getDependencies();
- }
- catch ( Exception e )
- {
- throw new ArtifactMetadataRetrievalException( "Unable to
read the metadata file", e );
- }
- finally
- {
- IoUtils.close( reader );
- }
+ FileReader reader = null;
+ try
+ {
+ reader = new FileReader( metadataArtifact.getFile() );
+ Model model = this.reader.read( reader );
+ dependencies = model.getDependencies();
+ }
+ catch ( Exception e )
+ {
+ throw new ArtifactMetadataRetrievalException( "Unable to
read the metadata file", e );
+ }
+ finally
+ {
+ IoUtils.close( reader );
}
}
return artifactFactory.createArtifacts( dependencies,
localRepository, artifact.getScope() );
No revision
No revision
1.62.2.1 +118 -105
maven-components/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
Index: DefaultMavenProjectBuilder.java
===================================================================
RCS file:
/home/cvs/maven-components/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java,v
retrieving revision 1.62
retrieving revision 1.62.2.1
diff -u -r1.62 -r1.62.2.1
--- DefaultMavenProjectBuilder.java 6 Apr 2005 01:28:29 -0000 1.62
+++ DefaultMavenProjectBuilder.java 8 Apr 2005 04:35:21 -0000 1.62.2.1
@@ -26,6 +26,7 @@
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.model.Build;
import org.apache.maven.model.DistributionManagement;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
@@ -104,69 +105,126 @@
// MavenProjectBuilder Implementation
// ----------------------------------------------------------------------
- public MavenProject buildWithDependencies( File project,
ArtifactRepository localRepository )
+ public MavenProject buildWithDependencies( File projectDescriptor,
ArtifactRepository localRepository )
throws ProjectBuildingException
{
- return build( project, localRepository, true, true );
+ return buildFromSourceFile( projectDescriptor, localRepository, true
);
}
- public MavenProject build( File project, ArtifactRepository
localRepository )
+ public MavenProject build( File projectDescriptor, ArtifactRepository
localRepository )
throws ProjectBuildingException
{
- return build( project, localRepository, false, true );
+ return buildFromSourceFile( projectDescriptor, localRepository,
false );
}
- public MavenProject buildFromRepository( Artifact artifact,
ArtifactRepository localRepository )
+ private MavenProject buildFromSourceFile( File projectDescriptor,
ArtifactRepository localRepository,
+ boolean resolveDependencies )
throws ProjectBuildingException
{
- return build( artifact.getFile(), localRepository, false, false );
+ Model model = readModel( projectDescriptor );
+
+ // Always cache files in the source tree over those in the repository
+ modelCache.put( createCacheKey( model.getGroupId(),
model.getArtifactId(), model.getVersion() ), model );
+
+ MavenProject project = build( model, localRepository,
resolveDependencies );
+
+ // Only translate the base directory for files in the source tree
+ pathTranslator.alignToBaseDirectory( project.getModel(),
projectDescriptor );
+
+ Build build = project.getBuild();
+ project.addCompileSourceRoot( build.getSourceDirectory() );
+ project.addScriptSourceRoot( build.getScriptSourceDirectory() );
+ project.addTestCompileSourceRoot( build.getTestSourceDirectory() );
+
+ // Only track the file of a POM in the source tree
+ project.setFile( projectDescriptor );
+
+ return project;
}
- private MavenProject build( File projectDescriptor, ArtifactRepository
localRepository,
- boolean resolveDependencies, boolean
sourceProject )
+ public MavenProject buildFromRepository( Artifact artifact, List
remoteArtifactRepositories,
+ ArtifactRepository
localRepository )
throws ProjectBuildingException
{
- try
+ Model model = findModelFromRepository( artifact,
remoteArtifactRepositories, localRepository );
+
+ return build( model, localRepository, false );
+ }
+
+ private Model findModelFromRepository( Artifact artifact, List
remoteArtifactRepositories,
+ ArtifactRepository
localRepository )
+ throws ProjectBuildingException
+ {
+ Model model = getCachedModel( artifact.getGroupId(),
artifact.getArtifactId(), artifact.getVersion() );
+ if ( model == null )
{
- Model superModel = getSuperModel();
-
- LinkedList lineage = new LinkedList();
+ try
+ {
+ artifactResolver.resolve( artifact,
remoteArtifactRepositories, localRepository );
+ }
+ catch ( ArtifactResolutionException e )
+ {
+ throw new ProjectBuildingException( "Unable to find
artifact: " + artifact.toString() );
+ }
+ model = readModel( artifact.getFile() );
+ }
+ return model;
+ }
- List aggregatedRemoteWagonRepositories =
buildArtifactRepositories( superModel.getRepositories() );
- MavenProject project = assembleLineage( projectDescriptor,
localRepository, lineage,
-
aggregatedRemoteWagonRepositories );
+ private MavenProject build( Model model, ArtifactRepository
localRepository, boolean resolveDependencies )
+ throws ProjectBuildingException
+ {
+ Model superModel = getSuperModel();
- Model previous = superModel;
+ LinkedList lineage = new LinkedList();
- for ( Iterator i = lineage.iterator(); i.hasNext(); )
- {
- Model current = ( (MavenProject) i.next() ).getModel();
+ List aggregatedRemoteWagonRepositories = buildArtifactRepositories(
superModel.getRepositories() );
- modelInheritanceAssembler.assembleModelInheritance( current,
previous );
+ MavenProject project = assembleLineage( model, lineage,
aggregatedRemoteWagonRepositories, localRepository );
- previous = current;
- }
-
- project = processProjectLogic( project, localRepository,
aggregatedRemoteWagonRepositories,
- resolveDependencies,
sourceProject );
+ Model previous = superModel;
- return project;
+ for ( Iterator i = lineage.iterator(); i.hasNext(); )
+ {
+ Model current = ( (MavenProject) i.next() ).getModel();
+
+ modelInheritanceAssembler.assembleModelInheritance( current,
previous );
+
+ previous = current;
}
- catch ( Exception e )
+
+ try
+ {
+ project = processProjectLogic( project, localRepository,
aggregatedRemoteWagonRepositories,
+ resolveDependencies );
+ }
+ catch ( ModelInterpolationException e )
+ {
+ throw new ProjectBuildingException( "Error building project: " +
model.getId(), e );
+ }
+ catch ( ArtifactResolutionException e )
{
- throw new ProjectBuildingException( "Error building project from
" + projectDescriptor, e );
+ throw new ProjectBuildingException( "Error building project: " +
model.getId(), e );
}
+
+ return project;
}
+ /**
+ * @todo can this take in a model instead of a project and still be
successful?
+ * @todo In fact, does project REALLY need a MavenProject as a parent?
Couldn't it have just a wrapper around a
+ * model that supported parents which were also the wrapper so that
inheritence was assembled. We don't really need
+ * the resolved source roots, etc for the parent - that occurs for the
parent when it is constructed independently
+ * and projects are not cached or reused
+ */
private MavenProject processProjectLogic( MavenProject project,
ArtifactRepository localRepository,
- List remoteRepositories,
boolean resolveDependencies,
- boolean sourceProject )
+ List remoteRepositories,
boolean resolveDependencies )
throws ProjectBuildingException, ModelInterpolationException,
ArtifactResolutionException
{
Model model = project.getModel();
String key = createCacheKey( model.getGroupId(),
model.getArtifactId(), model.getVersion() );
Model cachedModel = (Model) modelCache.get( key );
- if ( cachedModel == null || sourceProject )
+ if ( cachedModel == null )
{
modelCache.put( key, model );
}
@@ -178,12 +236,6 @@
MavenProject parentProject = project.getParent();
- File projectDescriptor = project.getFile();
- if ( sourceProject )
- {
- pathTranslator.alignToBaseDirectory( model, projectDescriptor );
- }
-
project = new MavenProject( model );
try
@@ -209,7 +261,6 @@
}
}
- project.setFile( projectDescriptor );
project.setParent( parentProject );
project.setRemoteArtifactRepositories( remoteRepositories );
project.setArtifacts( artifactFactory.createArtifacts(
project.getDependencies(), localRepository, null ) );
@@ -244,27 +295,11 @@
throw new ProjectBuildingException( "Exception while building
project: " + validationResult.toString() );
}
- project.addCompileSourceRoot(
project.getBuild().getSourceDirectory() );
- project.addScriptSourceRoot(
project.getBuild().getScriptSourceDirectory() );
- project.addTestCompileSourceRoot(
project.getBuild().getTestSourceDirectory() );
-
return project;
}
- private MavenProject assembleLineage( File projectDescriptor,
ArtifactRepository localRepository,
- LinkedList lineage, List
aggregatedRemoteWagonRepositories )
- throws ProjectBuildingException
- {
- Model model = readModel( projectDescriptor );
- MavenProject project = assembleLineage( model, localRepository,
lineage, aggregatedRemoteWagonRepositories );
- project.setFile( projectDescriptor );
-
- return project;
-
- }
-
- private MavenProject assembleLineage( Model model, ArtifactRepository
localRepository, LinkedList lineage,
- List
aggregatedRemoteWagonRepositories )
+ private MavenProject assembleLineage( Model model, LinkedList lineage,
List aggregatedRemoteWagonRepositories,
+ ArtifactRepository localRepository
)
throws ProjectBuildingException
{
aggregatedRemoteWagonRepositories.addAll( buildArtifactRepositories(
model.getRepositories() ) );
@@ -299,19 +334,13 @@
// as we go in order to do this.
//
----------------------------------------------------------------------
- MavenProject parent;
- Model cachedModel = getCachedModel( parentModel.getGroupId(),
parentModel.getArtifactId(),
- parentModel.getVersion() );
- if ( cachedModel == null )
- {
- File parentPom = findParentModel( parentModel,
aggregatedRemoteWagonRepositories, localRepository );
+ Artifact artifact = artifactFactory.createArtifact(
parentModel.getGroupId(), parentModel.getArtifactId(),
+
parentModel.getVersion(), null, "pom", null );
+
+ model = findModelFromRepository( artifact,
aggregatedRemoteWagonRepositories, localRepository );
+
+ MavenProject parent = assembleLineage( model, lineage,
aggregatedRemoteWagonRepositories, localRepository );
- parent = assembleLineage( parentPom, localRepository,
lineage, aggregatedRemoteWagonRepositories );
- }
- else
- {
- parent = assembleLineage( cachedModel, localRepository,
lineage, aggregatedRemoteWagonRepositories );
- }
project.setParent( parent );
}
@@ -343,15 +372,16 @@
ArtifactRepositoryLayout remoteRepoLayout = null;
try
{
- remoteRepoLayout = (ArtifactRepositoryLayout)
container.lookup( ArtifactRepositoryLayout.ROLE,
-
layout );
+ remoteRepoLayout =
+ (ArtifactRepositoryLayout) container.lookup(
ArtifactRepositoryLayout.ROLE, layout );
}
catch ( ComponentLookupException e )
{
- throw new ProjectBuildingException( "Cannot find layout
implementation corresponding to: \'" + layout + "\' for remote repository with
id: \'" + mavenRepo.getId() + "\'.",
+ throw new ProjectBuildingException( "Cannot find layout
implementation corresponding to: \'" + layout +
+ "\' for remote
repository with id: \'" + mavenRepo.getId() + "\'.",
e );
}
-
+
ArtifactRepository artifactRepo =
artifactRepositoryFactory.createArtifactRepository( mavenRepo, settings,
remoteRepoLayout );
@@ -367,45 +397,47 @@
throws Exception
{
List remotePluginRepositories = new ArrayList();
-
+
MavenSettings settings = mavenSettingsBuilder.buildSettings();
for ( Iterator it = pluginRepositories.iterator(); it.hasNext(); )
{
Repository mavenRepo = (Repository) it.next();
-
+
String layout = mavenRepo.getLayout();
ArtifactRepositoryLayout repositoryLayout = null;
try
{
- repositoryLayout = (ArtifactRepositoryLayout)
container.lookup( ArtifactRepositoryLayout.ROLE,
-
layout );
+ repositoryLayout =
+ (ArtifactRepositoryLayout) container.lookup(
ArtifactRepositoryLayout.ROLE, layout );
}
catch ( ComponentLookupException e )
{
- throw new ProjectBuildingException( "Cannot find layout
implementation corresponding to: \'" + layout + "\' for remote repository with
id: \'" + mavenRepo.getId() + "\'.",
+ throw new ProjectBuildingException( "Cannot find layout
implementation corresponding to: \'" + layout +
+ "\' for remote
repository with id: \'" + mavenRepo.getId() + "\'.",
e );
}
-
- ArtifactRepository pluginRepository =
artifactRepositoryFactory.createArtifactRepository( mavenRepo, settings,
+
+ ArtifactRepository pluginRepository =
artifactRepositoryFactory.createArtifactRepository( mavenRepo,
+
settings,
repositoryLayout );
remotePluginRepositories.add( pluginRepository );
}
-
+
return remotePluginRepositories;
}
private ArtifactRepository buildDistributionManagementRepository(
Repository dmRepo )
throws Exception
{
- if(dmRepo == null)
+ if ( dmRepo == null )
{
return null;
}
-
+
MavenSettings settings = mavenSettingsBuilder.buildSettings();
String repoLayoutId = dmRepo.getLayout();
@@ -426,7 +458,8 @@
try
{
reader = new FileReader( file );
- return modelReader.read( reader );
+ Model model = modelReader.read( reader );
+ return model;
}
catch ( FileNotFoundException e )
{
@@ -460,27 +493,7 @@
}
}
- private File findParentModel( Parent parent, List
remoteArtifactRepositories, ArtifactRepository localRepository )
- throws ProjectBuildingException
- {
- Artifact artifact = artifactFactory.createArtifact(
parent.getGroupId(), parent.getArtifactId(),
-
parent.getVersion(), null, "pom", null );
-
- try
- {
- artifactResolver.resolve( artifact, remoteArtifactRepositories,
localRepository );
- }
- catch ( ArtifactResolutionException e )
- {
- // @todo use parent.toString() if modello could generate it, or
specify in a code segment
- throw new ProjectBuildingException( "Missing parent POM: " +
parent.getGroupId() + ":" +
- parent.getArtifactId() + "-"
+ parent.getVersion(), e );
- }
-
- return artifact.getFile();
- }
-
- public Model getCachedModel( String groupId, String artifactId, String
version )
+ private Model getCachedModel( String groupId, String artifactId, String
version )
{
return (Model) modelCache.get( createCacheKey( groupId, artifactId,
version ) );
}
@@ -509,7 +522,7 @@
List remoteRepositories = buildArtifactRepositories(
superModel.getRepositories() );
- project = processProjectLogic( project, localRepository,
remoteRepositories, false, false );
+ project = processProjectLogic( project, localRepository,
remoteRepositories, false );
return project;
}
1.16.2.1 +15 -7
maven-components/maven-core/src/main/java/org/apache/maven/project/MavenProjectBuilder.java
Index: MavenProjectBuilder.java
===================================================================
RCS file:
/home/cvs/maven-components/maven-core/src/main/java/org/apache/maven/project/MavenProjectBuilder.java,v
retrieving revision 1.16
retrieving revision 1.16.2.1
diff -u -r1.16 -r1.16.2.1
--- MavenProjectBuilder.java 23 Mar 2005 06:52:52 -0000 1.16
+++ MavenProjectBuilder.java 8 Apr 2005 04:35:21 -0000 1.16.2.1
@@ -19,18 +19,18 @@
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.model.Model;
import java.io.File;
+import java.util.List;
public interface MavenProjectBuilder
{
String ROLE = MavenProjectBuilder.class.getName();
-
+
static final String STANDALONE_SUPERPOM_GROUPID = "org.apache.maven";
-
+
static final String STANDALONE_SUPERPOM_ARTIFACTID = "super-pom";
-
+
static final String STANDALONE_SUPERPOM_VERSION = "2.0";
MavenProject build( File project, ArtifactRepository localRepository )
@@ -39,11 +39,19 @@
MavenProject buildWithDependencies( File project, ArtifactRepository
localRepository )
throws ProjectBuildingException;
- MavenProject buildFromRepository( Artifact artifact, ArtifactRepository
localRepository )
+ /**
+ * Build the artifact from the local repository, resolving it if
necessary.
+ *
+ * @param artifact the artifact description
+ * @param localRepository the local repository
+ * @param remoteArtifactRepositories the remote repository list
+ * @return the built project
+ * @throws ProjectBuildingException
+ */
+ MavenProject buildFromRepository( Artifact artifact, List
remoteArtifactRepositories,
+ ArtifactRepository localRepository )
throws ProjectBuildingException;
MavenProject buildStandaloneSuperProject( ArtifactRepository
localRepository )
throws ProjectBuildingException;
-
- Model getCachedModel( String groupId, String artifactId, String version
);
}