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]