Author: jdcasey
Date: Tue Jul 26 12:45:45 2005
New Revision: 225379

URL: http://svn.apache.org/viewcvs?rev=225379&view=rev
Log:
Working on: MNG-521

o Cleaned up output from discovery of MavenProjectBuilder instance in 
MavenProjectTestCase.
o Added <relativePath/> to parent in maven.mdo (default value is '../pom.xml')
o Added filesystem parent-POM search using <relativePath/>...if discovered pom 
doesn't match the parent specification (g:a:v), then it's not used - the parent 
is resolved - and search for ancestor POMs on disk goes no further.

NOTE: Next thing is to reactor-ize the release plugin, then MNG-521 should be 
implemented.


Modified:
    maven/components/trunk/maven-model/maven.mdo
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
    
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/MavenProjectTestCase.java

Modified: maven/components/trunk/maven-model/maven.mdo
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-model/maven.mdo?rev=225379&r1=225378&r2=225379&view=diff
==============================================================================
--- maven/components/trunk/maven-model/maven.mdo (original)
+++ maven/components/trunk/maven-model/maven.mdo Tue Jul 26 12:45:45 2005
@@ -1675,6 +1675,13 @@
           <description><![CDATA[The version of the project to 
extend.]]></description>
           <type>String</type>
         </field>
+        <field>
+          <name>relativePath</name>
+          <version>4.0.0</version>
+          <description><![CDATA[The relative path of the parent-pom within the 
project hierarchy]]></description>
+          <type>String</type>
+          <defaultValue>../pom.xml</defaultValue>
+        </field>
       </fields>
     </class>
     <class>

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java?rev=225379&r1=225378&r2=225379&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
 Tue Jul 26 12:45:45 2005
@@ -224,7 +224,7 @@
         modelCache.put( createCacheKey( model.getGroupId(), 
model.getArtifactId(), model.getVersion() ), model );
 
         MavenProject project = build( projectDescriptor.getAbsolutePath(), 
model, localRepository,
-                                      Collections.EMPTY_LIST, externalProfiles 
);
+                                      Collections.EMPTY_LIST, 
externalProfiles, projectDescriptor.getAbsoluteFile().getParentFile() );
 
         // Only translate the base directory for files in the source tree
         pathTranslator.alignToBaseDirectory( project.getModel(), 
projectDescriptor );
@@ -247,7 +247,7 @@
         Model model = findModelFromRepository( artifact, 
remoteArtifactRepositories, localRepository );
 
         return build( "Artifact [" + artifact.getId() + "]", model, 
localRepository, remoteArtifactRepositories,
-                      Collections.EMPTY_LIST );
+                      Collections.EMPTY_LIST, null );
     }
 
     private Model findModelFromRepository( Artifact artifact, List 
remoteArtifactRepositories,
@@ -303,7 +303,7 @@
     }
 
     private MavenProject build( String pomLocation, Model model, 
ArtifactRepository localRepository,
-                                List remoteArtifactRepositories, List 
externalProfiles )
+                                List remoteArtifactRepositories, List 
externalProfiles, File projectDir )
         throws ProjectBuildingException
     {
         Model superModel = getSuperModel();
@@ -341,7 +341,7 @@
         
         List repositories = new ArrayList( aggregatedRemoteWagonRepositories );
         
-        MavenProject project = assembleLineage( model, lineage, repositories, 
localRepository );
+        MavenProject project = assembleLineage( model, lineage, repositories, 
localRepository, externalProfiles, projectDir );
 
         project.setOriginalModel( originalModel );
 
@@ -475,7 +475,7 @@
 
     /** @noinspection CollectionDeclaredAsConcreteClass*/
     private MavenProject assembleLineage( Model model, LinkedList lineage, 
List aggregatedRemoteWagonRepositories,
-                                          ArtifactRepository localRepository )
+                                          ArtifactRepository localRepository, 
List externalProfiles, File projectDir )
         throws ProjectBuildingException
     {
         if ( !model.getRepositories().isEmpty() )
@@ -514,27 +514,81 @@
             {
                 throw new ProjectBuildingException( "Missing version element 
from parent element" );
             }
+            
+            model = getCachedModel( parentModel.getGroupId(), 
parentModel.getArtifactId(), parentModel.getVersion() );
+            
+            // the only way this will have a value is if we find the parent on 
disk...
+            File parentProjectDir = null;
+            
+            String parentRelativePath = parentModel.getRelativePath();
+            
+            // if we can't find a cached model matching the parent spec, then 
let's try to look on disk using
+            // <relativePath/>
+            if ( model == null && projectDir != null && 
StringUtils.isNotEmpty(parentRelativePath) )
+            {
+                File parentDescriptor = new File( projectDir, 
parentRelativePath );
+                
+                try
+                {
+                    parentDescriptor = parentDescriptor.getCanonicalFile();
+                }
+                catch ( IOException e )
+                {
+                    getLogger().debug( "Failed to canonicalize potential 
parent POM: \'" + parentDescriptor + "\'", e );
+                    
+                    parentDescriptor = null;
+                }
+                
+                if ( parentDescriptor != null && parentDescriptor.exists() )
+                {
+                    Model candidateParent = readModel( parentDescriptor );
+                    
+                    // this works because parent-version is still required...
+                    if ( parentModel.getGroupId().equals( 
candidateParent.getGroupId() )
+                        && parentModel.getArtifactId().equals( 
candidateParent.getArtifactId() )
+                        && ( parentModel.getVersion().equals( 
candidateParent.getVersion() ) 
+                            || ( candidateParent.getParent() != null 
+                                && 
parentModel.getVersion().equals(candidateParent.getParent().getVersion() ) ) ) )
+                    {
+                        model = candidateParent;
+                        
+                        parentProjectDir = parentDescriptor.getParentFile();
+                        
+                        getLogger().debug( "Using parent-POM from the project 
hierarchy at: \'" + parentModel.getRelativePath() + "\' for project: " + 
project.getId() );
+                    }
+                    else
+                    {
+                        getLogger().debug("Invalid parent-POM referenced by 
relative path: \'" + parentModel.getRelativePath() + "\'. It did not match 
parent specification in " + project.getId() );
+                    }
+                }
+            }
+            
+            Artifact parentArtifact = null;
 
-            //!! (**)
-            // 
----------------------------------------------------------------------
-            // Do we have the necessary information to actually find the parent
-            // POMs here?? I don't think so ... Say only one remote repository 
is
-            // specified and that is ibiblio then this model that we just read 
doesn't
-            // have any repository information ... I think we might have to 
inherit
-            // as we go in order to do this.
-            // 
----------------------------------------------------------------------
-
-            Artifact artifact = artifactFactory.createParentArtifact( 
parentModel.getGroupId(),
-                                                                      
parentModel.getArtifactId(),
-                                                                      
parentModel.getVersion() );
+            // only resolve the parent model from the repository system if we 
didn't find it on disk...
+            if ( model == null )
+            {
+                //!! (**)
+                // 
----------------------------------------------------------------------
+                // Do we have the necessary information to actually find the 
parent
+                // POMs here?? I don't think so ... Say only one remote 
repository is
+                // specified and that is ibiblio then this model that we just 
read doesn't
+                // have any repository information ... I think we might have 
to inherit
+                // as we go in order to do this.
+                // 
----------------------------------------------------------------------
+
+                parentArtifact = artifactFactory.createParentArtifact( 
parentModel.getGroupId(),
+                                                                       
parentModel.getArtifactId(),
+                                                                       
parentModel.getVersion() );
 
-            model = findModelFromRepository( artifact, 
aggregatedRemoteWagonRepositories, localRepository );
+                model = findModelFromRepository( parentArtifact, 
aggregatedRemoteWagonRepositories, localRepository );
+            }
 
-            MavenProject parent = assembleLineage( model, lineage, 
aggregatedRemoteWagonRepositories, localRepository );
+            MavenProject parent = assembleLineage( model, lineage, 
aggregatedRemoteWagonRepositories, localRepository, externalProfiles, 
parentProjectDir );
 
             project.setParent( parent );
 
-            project.setParentArtifact( artifact );
+            project.setParentArtifact( parentArtifact );
         }
 
         return project;

Modified: 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/MavenProjectTestCase.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/MavenProjectTestCase.java?rev=225379&r1=225378&r2=225379&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/MavenProjectTestCase.java
 (original)
+++ 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/MavenProjectTestCase.java
 Tue Jul 26 12:45:45 2005
@@ -41,17 +41,15 @@
     {
         super.setUp();
 
-        try
+        if ( getContainer().hasComponent( MavenProjectBuilder.ROLE, "test" ) )
         {
             projectBuilder = (MavenProjectBuilder) lookup( 
MavenProjectBuilder.ROLE, "test" );
         }
-        catch ( ComponentLookupException e )
+        else
         {
             // default over to the main project builder...
             projectBuilder = (MavenProjectBuilder) lookup( 
MavenProjectBuilder.ROLE );
         }
-        
-        System.out.println("Using project builder: " + 
projectBuilder.getClass().getName() + " for tests in: " + getClass().getName());
     }
 
     // ----------------------------------------------------------------------



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to