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 
);
   }
  
  
  

Reply via email to