Index: maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java =================================================================== --- maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java (revision 754502) +++ maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java (working copy) @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.Reader; +import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Method; @@ -139,10 +140,12 @@ throws ProjectBuildingException { MavenProject project = readModelFromLocalPath( "unknown", pomFile, configuration.getLocalRepository(), configuration.getRemoteRepositories(), configuration ); + List activeProfiles = project.getActiveProfiles(); project.setFile( pomFile ); project = buildWithProfiles( project.getModel(), configuration, pomFile, project.getParentFile() ); + project.getActiveProfiles().addAll( activeProfiles ); Build build = project.getBuild(); // NOTE: setting this script-source root before path translation, because @@ -207,7 +210,9 @@ } */ project = readModelFromLocalPath( "unknown", artifact.getFile(), config.getLocalRepository(), remoteRepositories, config ); + List activeProfiles = project.getActiveProfiles(); project = buildWithProfiles( project.getModel(), config, artifact.getFile(), project.getParentFile() ); + project.getActiveProfiles().addAll( activeProfiles ); artifact.setFile( artifact.getFile() ); project.setVersion( artifact.getVersion() ); @@ -514,14 +519,13 @@ } } - protected PomClassicDomainModel buildModel( File pom, Collection interpolatorProperties, ArtifactRepository localRepository, List remoteRepositories ) + ModelBuildResult buildModel( File pom, Collection interpolatorProperties, ArtifactRepository localRepository, List remoteRepositories ) throws IOException { return buildModel( pom, interpolatorProperties, null, null, localRepository, remoteRepositories ); } - @SuppressWarnings("unchecked") - private PomClassicDomainModel buildModel( File pom, Collection interpolatorProperties, Collection activeProfileIds, Collection inactiveProfileIds, + private ModelBuildResult buildModel( File pom, Collection interpolatorProperties, Collection activeProfileIds, Collection inactiveProfileIds, ArtifactRepository localRepository, List remoteRepositories ) throws IOException { @@ -558,8 +562,13 @@ //Process Profile on most specialized child model ProfileContext profileContext = new ProfileContext( new DefaultModelDataSource( domainModel.getModelProperties(), PomTransformer.MODEL_CONTAINER_FACTORIES ), activeProfileIds, inactiveProfileIds, properties ); - - domainModels.addAll( transformProfiles( profileContext ) ); + List profileModels = transformProfiles( profileContext ); + List activeProfiles = new ArrayList(); + for ( ModelBuildResult modelBuildResult : profileModels ) + { + activeProfiles.addAll( modelBuildResult.getActiveProfiles() ); + domainModels.add( modelBuildResult.getDomainModel() ); + } domainModels.add( domainModel ); File parentFile = null; @@ -600,7 +609,7 @@ transformedDomainModel.setLineageCount( lineageCount + 1 ); transformedDomainModel.setParentFile( parentFile ); - return transformedDomainModel; + return new ModelBuildResult( transformedDomainModel, activeProfiles ); } private PomClassicDomainModel convertToDomainModel( Model model, boolean isMostSpecialized ) @@ -628,7 +637,7 @@ return new PomClassicDomainModel( new ByteArrayInputStream( baos.toByteArray() ), isMostSpecialized ); } - protected MavenProject buildFromLocalPath( File pom, Collection interpolatorProperties, ArtifactRepository localRepository, List remoteRepositories, + MavenProject buildFromLocalPath( File pom, Collection interpolatorProperties, ArtifactRepository localRepository, List remoteRepositories, ProjectBuilderConfiguration projectBuilderConfiguration, MavenProjectBuilder mavenProjectBuilder ) throws IOException { @@ -640,13 +649,17 @@ .getGlobalProfileManager().getProfileActivationContext() != null ) ? projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext().getExplicitlyInactiveProfileIds() : new ArrayList(); - PomClassicDomainModel domainModel = buildModel( pom, interpolatorProperties, activeProfileIds, inactiveProfileIds, localRepository, remoteRepositories ); + ModelBuildResult extendedModel = + buildModel( pom, interpolatorProperties, activeProfileIds, inactiveProfileIds, localRepository, + remoteRepositories ); + PomClassicDomainModel domainModel = extendedModel.getDomainModel(); try { MavenProject mavenProject = new MavenProject( convertFromInputStreamToModel( domainModel.getInputStream() ), repositorySystem, mavenProjectBuilder, projectBuilderConfiguration ); mavenProject.setParentFile( domainModel.getParentFile() ); + mavenProject.setActiveProfiles( extendedModel.getActiveProfiles() ); return mavenProject; } @@ -740,21 +753,40 @@ //Process Profiles ProfileContext profileContext = new ProfileContext( new DefaultModelDataSource( parentDomainModel.getModelProperties(), PomTransformer.MODEL_CONTAINER_FACTORIES ), activeProfileIds, inactiveProfileIds, properties ); - domainModels.addAll( transformProfiles( profileContext ) ); + for ( ModelBuildResult modelBuildResult : transformProfiles( profileContext ) ) + { + domainModels.add( modelBuildResult.getDomainModel() ); + } domainModels.addAll( getDomainModelParentsFromRepository( parentDomainModel, localRepository, remoteRepositories, properties, activeProfileIds, inactiveProfileIds ) ); return domainModels; } - private static List transformProfiles( ProfileContext profileContext ) + private List transformProfiles( ProfileContext profileContext ) throws IOException { - List domainModels = new ArrayList(); + List domainModels = new ArrayList(); Collection profileContainers = profileContext.getActiveProfiles(); for ( ModelContainer mc : profileContainers ) { + List props = new ArrayList( mc.getProperties().size() + 2 ); + props.add( new ModelProperty( ProjectUri.xUri, null ) ); + props.add( new ModelProperty( ProjectUri.Profiles.xUri, null ) ); + props.addAll( mc.getProperties() ); + String xml = ModelMarshaller.unmarshalModelPropertiesToXml( props, ProjectUri.baseUri ); + Profile profile; + try + { + Model model = modelReader.read( new StringReader( xml ) ); + profile = model.getProfiles().get( 0 ); + } + catch ( XmlPullParserException e ) + { + throw new IllegalStateException( "Failed to parse profile", e ); + } + List transformed = new ArrayList(); transformed.add( new ModelProperty( ProjectUri.xUri, null ) ); for ( ModelProperty mp : mc.getProperties() ) @@ -768,7 +800,7 @@ } } - domainModels.add( new PomClassicDomainModel( transformed ) ); + domainModels.add( new ModelBuildResult( new PomClassicDomainModel( transformed ), profile) ); } return domainModels; @@ -814,7 +846,10 @@ //Process Profiles ProfileContext profileContext = new ProfileContext( new DefaultModelDataSource( parentDomainModel.getModelProperties(), PomTransformer.MODEL_CONTAINER_FACTORIES ), activeProfileIds, inactiveProfileIds, properties ); - domainModels.addAll( transformProfiles( profileContext ) ); + for ( ModelBuildResult profileModel : transformProfiles( profileContext ) ) + { + domainModels.add( profileModel.getDomainModel() ); + } if ( !parentDomainModel.matchesParentOf( domainModel ) ) { @@ -859,7 +894,7 @@ private Model superModel; - protected Model getSuperModel() + private Model getSuperModel() { if ( superModel != null ) { @@ -886,4 +921,34 @@ return superModel; } -} \ No newline at end of file + static class ModelBuildResult + { + + private PomClassicDomainModel domainModel; + + private List activeProfiles; + + public ModelBuildResult( PomClassicDomainModel domainModel, Profile activeProfile ) + { + this( domainModel, new ArrayList( Arrays.asList( activeProfile ) ) ); + } + + public ModelBuildResult( PomClassicDomainModel domainModel, List activeProfiles ) + { + this.domainModel = domainModel; + this.activeProfiles = activeProfiles; + } + + public PomClassicDomainModel getDomainModel() + { + return domainModel; + } + + public List getActiveProfiles() + { + return activeProfiles; + } + + } + +} Index: maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java =================================================================== --- maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java (revision 754086) +++ maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java (working copy) @@ -950,7 +950,7 @@ { pomFile = new File( pomFile, "pom.xml" ); } - return new PomTestWrapper( pomFile, mavenProjectBuilder.buildModel( pomFile, null, null, null ) ); + return new PomTestWrapper( pomFile, mavenProjectBuilder.buildModel( pomFile, null, null, null ).getDomainModel() ); } private PomTestWrapper buildPomFromMavenProject( String pomPath, String profileId )