Replaced the old profile injector code with new profile code. Merged project builders.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@748609 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Britton Isbell 2009-02-27 17:28:54 +00:00
parent 0f4e3cd061
commit 7040079ca9
18 changed files with 703 additions and 1451 deletions

View File

@ -68,7 +68,6 @@ import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.project.DuplicateArtifactAttachmentException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.project.builder.PomInterpolatorTag;
@ -156,9 +155,6 @@ public class DefaultPluginManager
@Requirement
private PluginRepository pluginRepository;
@Requirement
private ProjectBuilder projectBuilder;
public DefaultPluginManager()
{
pluginDescriptorBuilder = new PluginDescriptorBuilder();

View File

@ -40,7 +40,6 @@ import org.apache.maven.monitor.event.DefaultEventMonitor;
import org.apache.maven.monitor.event.EventMonitor;
import org.apache.maven.profiles.DefaultProfileManager;
import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
import org.apache.maven.profiles.activation.ProfileActivationContext;
import org.apache.maven.realm.DefaultMavenRealmManager;
import org.apache.maven.repository.MavenRepositorySystem;
@ -568,7 +567,7 @@ public class DefaultMavenExecutionRequestPopulator
ProfileActivationContext activationContext = request.getProfileActivationContext();
if ( activationContext == null )
{
activationContext = new DefaultProfileActivationContext( request.getProperties(), false );
activationContext = new ProfileActivationContext( request.getProperties(), false );
}
activationContext.setExplicitlyActiveProfileIds( request.getActiveProfiles() );

View File

@ -24,7 +24,6 @@ import org.apache.maven.model.Model;
import org.apache.maven.model.Profile;
import org.apache.maven.model.Parent;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
import org.apache.maven.profiles.activation.ProfileActivationContext;
import org.apache.maven.profiles.activation.ProfileActivationException;
import org.apache.maven.shared.model.ModelContainer;
@ -87,7 +86,7 @@ public class DefaultProfileManager
private ProfileActivationContext createDefaultActivationContext()
{
return new DefaultProfileActivationContext(System.getProperties(), false );
return new ProfileActivationContext(System.getProperties(), false );
}
public ProfileActivationContext getProfileActivationContext()

View File

@ -1,153 +0,0 @@
package org.apache.maven.profiles.activation;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
public class DefaultProfileActivationContext
implements ProfileActivationContext
{
private boolean isCustomActivatorFailureSuppressed;
private final Properties executionProperties;
List explicitlyActive;
List explicitlyInactive;
private List activeByDefault;
public DefaultProfileActivationContext( Properties executionProperties, boolean isCustomActivatorFailureSuppressed )
{
this.executionProperties = executionProperties;
this.isCustomActivatorFailureSuppressed = isCustomActivatorFailureSuppressed;
}
public Properties getExecutionProperties()
{
return executionProperties;
}
public boolean isCustomActivatorFailureSuppressed()
{
return isCustomActivatorFailureSuppressed;
}
public void setCustomActivatorFailureSuppressed( boolean suppressed )
{
isCustomActivatorFailureSuppressed = suppressed;
}
public List getExplicitlyActiveProfileIds()
{
if ( explicitlyActive == null )
{
return Collections.EMPTY_LIST;
}
return explicitlyActive;
}
public void setExplicitlyActiveProfileIds( List active )
{
explicitlyActive = active;
}
public List getExplicitlyInactiveProfileIds()
{
if ( explicitlyInactive == null )
{
return Collections.EMPTY_LIST;
}
return explicitlyInactive;
}
public void setExplicitlyInactiveProfileIds( List inactive )
{
explicitlyInactive = inactive;
}
public void setActive( String profileId )
{
if ( explicitlyActive == null )
{
explicitlyActive = new ArrayList();
}
explicitlyActive.add( profileId );
}
public void setInactive( String profileId )
{
if ( explicitlyInactive == null )
{
explicitlyInactive = new ArrayList();
}
explicitlyInactive.add( profileId );
}
public boolean isExplicitlyActive( String profileId )
{
return ( explicitlyActive != null ) && explicitlyActive.contains( profileId );
}
public boolean isExplicitlyInactive( String profileId )
{
return ( explicitlyInactive != null ) && explicitlyInactive.contains( profileId );
}
public List getActiveByDefaultProfileIds()
{
if ( activeByDefault == null )
{
return Collections.EMPTY_LIST;
}
return activeByDefault;
}
public boolean isActiveByDefault( String profileId )
{
return ( activeByDefault != null ) && activeByDefault.contains( profileId );
}
public void setActiveByDefault( String profileId )
{
if ( activeByDefault == null )
{
activeByDefault = new ArrayList();
}
activeByDefault.add( profileId );
}
public void setActiveByDefaultProfileIds( List activeByDefault )
{
this.activeByDefault = activeByDefault;
}
}

View File

@ -20,40 +20,133 @@ package org.apache.maven.profiles.activation;
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
public interface ProfileActivationContext
public class ProfileActivationContext
{
List getExplicitlyActiveProfileIds();
private boolean isCustomActivatorFailureSuppressed;
List getExplicitlyInactiveProfileIds();
private final Properties executionProperties;
Properties getExecutionProperties();
List explicitlyActive;
boolean isCustomActivatorFailureSuppressed();
List explicitlyInactive;
void setCustomActivatorFailureSuppressed( boolean suppressed );
private List activeByDefault;
void setExplicitlyActiveProfileIds( List inactive );
public ProfileActivationContext( Properties executionProperties, boolean isCustomActivatorFailureSuppressed )
{
this.executionProperties = executionProperties;
this.isCustomActivatorFailureSuppressed = isCustomActivatorFailureSuppressed;
}
void setExplicitlyInactiveProfileIds( List inactive );
public Properties getExecutionProperties()
{
return executionProperties;
}
void setActive( String profileId );
public boolean isCustomActivatorFailureSuppressed()
{
return isCustomActivatorFailureSuppressed;
}
void setInactive( String profileId );
public void setCustomActivatorFailureSuppressed( boolean suppressed )
{
isCustomActivatorFailureSuppressed = suppressed;
}
boolean isExplicitlyActive( String profileId );
public List getExplicitlyActiveProfileIds()
{
if ( explicitlyActive == null )
{
return Collections.EMPTY_LIST;
}
boolean isExplicitlyInactive( String profileId );
return explicitlyActive;
}
List getActiveByDefaultProfileIds();
public void setExplicitlyActiveProfileIds( List active )
{
explicitlyActive = active;
}
void setActiveByDefaultProfileIds( List activeByDefault );
public List getExplicitlyInactiveProfileIds()
{
if ( explicitlyInactive == null )
{
return Collections.EMPTY_LIST;
}
void setActiveByDefault( String profileId );
return explicitlyInactive;
}
boolean isActiveByDefault( String profileId );
public void setExplicitlyInactiveProfileIds( List inactive )
{
explicitlyInactive = inactive;
}
public void setActive( String profileId )
{
if ( explicitlyActive == null )
{
explicitlyActive = new ArrayList();
}
explicitlyActive.add( profileId );
}
public void setInactive( String profileId )
{
if ( explicitlyInactive == null )
{
explicitlyInactive = new ArrayList();
}
explicitlyInactive.add( profileId );
}
public boolean isExplicitlyActive( String profileId )
{
return ( explicitlyActive != null ) && explicitlyActive.contains( profileId );
}
public boolean isExplicitlyInactive( String profileId )
{
return ( explicitlyInactive != null ) && explicitlyInactive.contains( profileId );
}
public List getActiveByDefaultProfileIds()
{
if ( activeByDefault == null )
{
return Collections.EMPTY_LIST;
}
return activeByDefault;
}
public boolean isActiveByDefault( String profileId )
{
return ( activeByDefault != null ) && activeByDefault.contains( profileId );
}
public void setActiveByDefault( String profileId )
{
if ( activeByDefault == null )
{
activeByDefault = new ArrayList();
}
activeByDefault.add( profileId );
}
public void setActiveByDefaultProfileIds( List activeByDefault )
{
this.activeByDefault = activeByDefault;
}
}

View File

@ -20,599 +20,150 @@ package org.apache.maven.profiles.injection;
*/
import org.apache.maven.model.*;
import org.apache.maven.project.ModelUtils;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.project.builder.*;
import org.apache.maven.shared.model.ModelProperty;
import org.apache.maven.shared.model.ModelMarshaller;
import org.apache.maven.shared.model.ModelTransformerContext;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.pull.XmlSerializer;
import org.codehaus.plexus.util.xml.pull.MXSerializer;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.ReaderFactory;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.*;
import java.io.*;
import java.lang.reflect.Method;
/**
* Inject profile data into a Model, using the profile as the dominant data source, and
* persisting results of the injection in the Model.
* <p/>
* This will look similar to the ModelUtils/DefaultModelInheritanceAssembler code, but
* they are distinct. In model inheritance, the child provides data dominance AND persists
* the results of the merge...sort of a 'merge-out' system.
* <p/>
* In this system, the profile is dominant, but the model receives the merge result...sort
* of a 'merge-in' system. The two pieces of code look like they could be combined with a
* set of flags to determine which direction to merge 'to', but there are enough differences
* in the code to justify the extra code involved with separating them, in order to simplify
* the logic.
*/
@Component(role = ProfileInjector.class)
public class DefaultProfileInjector
implements ProfileInjector
{
public void inject( Profile profile, Model model )
public Model inject( Profile profile, Model model )
{
model.setDependencies( injectDependencies( profile.getDependencies(), model.getDependencies() ) );
injectModules( profile, model );
model.setRepositories( ModelUtils.mergeRepositoryLists( profile.getRepositories(), model.getRepositories() ) );
model.setPluginRepositories( ModelUtils.mergeRepositoryLists( profile.getPluginRepositories(), model.getPluginRepositories() ) );
injectReporting( profile, model );
injectDependencyManagement( profile, model );
injectDistributionManagement( profile, model );
injectBuild( profile, model );
Properties props = new Properties();
props.putAll( model.getProperties() );
props.putAll( profile.getProperties() );
model.setProperties( props );
}
private void injectBuild( Profile profile, Model model )
//TODO: Using reflection now. Need to replace with custom mapper
StringWriter writer = new StringWriter();
XmlSerializer serializer = new MXSerializer();
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " " );
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
try
{
BuildBase profileBuild = profile.getBuild();
Build modelBuild = model.getBuild();
serializer.setOutput( writer );
serializer.startDocument("UTF-8", null );
} catch (IOException e) {
// if the parent build is null, obviously we cannot inherit from it...
if ( profileBuild != null )
{
if ( modelBuild == null )
{
modelBuild = new Build();
model.setBuild( modelBuild );
}
if ( profileBuild.getDirectory() != null )
{
modelBuild.setDirectory( profileBuild.getDirectory() );
}
try {
MavenXpp3Writer w = new MavenXpp3Writer();
Class c = Class.forName("org.apache.maven.model.io.xpp3.MavenXpp3Writer");
if ( profileBuild.getDefaultGoal() != null )
{
modelBuild.setDefaultGoal( profileBuild.getDefaultGoal() );
}
if ( profileBuild.getFinalName() != null )
{
modelBuild.setFinalName( profileBuild.getFinalName() );
}
Class partypes[] = new Class[3];
partypes[0] = Profile.class;
partypes[1] = String.class;
partypes[2] = XmlSerializer.class;
ModelUtils.mergeFilterLists( modelBuild.getFilters(), profileBuild.getFilters() );
mergeResourceLists( modelBuild.getResources(), profileBuild.getResources() );
mergeResourceLists( modelBuild.getTestResources(), profileBuild.getTestResources() );
Method meth = c.getDeclaredMethod(
"writeProfile", partypes);
meth.setAccessible(true);
injectPlugins( profileBuild, modelBuild );
Object arglist[] = new Object[3];
arglist[0] = profile;
arglist[1] = "profile";
arglist[2] = serializer;
// Plugin management :: aggregate
PluginManagement profilePM = profileBuild.getPluginManagement();
PluginManagement modelPM = modelBuild.getPluginManagement();
if ( modelPM == null )
{
modelBuild.setPluginManagement( profilePM );
meth.invoke(w, arglist);
serializer.endDocument();
}
else
catch (Exception e)
{
injectPlugins( profilePM, modelPM );
}
}
return null;
}
Set<String> uris = new HashSet(PomTransformer.URIS);
uris.add(ProjectUri.Profiles.Profile.Build.Plugins.Plugin.configuration);
/**
* This should be the resulting ordering of plugins after injection:
* <p/>
* Given:
* <p/>
* model: X -> A -> B -> D -> E
* profile: Y -> A -> C -> D -> F
* <p/>
* Result:
* <p/>
* X -> Y -> A -> B -> C -> D -> E -> F
*/
protected void injectPlugins( PluginContainer profileContainer, PluginContainer modelContainer )
List<ModelProperty> p;
try
{
if ( ( profileContainer == null ) || ( modelContainer == null ) )
{
// nothing to do...
return;
p = ModelMarshaller.marshallXmlToModelProperties(new ByteArrayInputStream(writer.getBuffer().toString().getBytes()),
ProjectUri.Profiles.xUri, uris);
} catch (IOException e) {
return null;
}
List modelPlugins = modelContainer.getPlugins();
if ( modelPlugins == null )
{
modelContainer.setPlugins( profileContainer.getPlugins() );
}
else if ( profileContainer.getPlugins() != null )
{
List mergedPlugins = new ArrayList();
Map profilePlugins = profileContainer.getPluginsAsMap();
for ( Iterator it = modelPlugins.iterator(); it.hasNext(); )
List<ModelProperty> transformed = new ArrayList<ModelProperty>();
for(ModelProperty mp : p)
{
Plugin modelPlugin = (Plugin) it.next();
Plugin profilePlugin = (Plugin) profilePlugins.get( modelPlugin.getKey() );
if ( ( profilePlugin != null ) && !mergedPlugins.contains( profilePlugin ) )
if(mp.getUri().startsWith(ProjectUri.Profiles.Profile.xUri) && !mp.getUri().equals(ProjectUri.Profiles.Profile.id)
&& !mp.getUri().startsWith(ProjectUri.Profiles.Profile.Activation.xUri) )
{
Plugin mergedPlugin = modelPlugin;
injectPluginDefinition( profilePlugin, modelPlugin );
mergedPlugins.add( mergedPlugin );
transformed.add(new ModelProperty(mp.getUri().replace(ProjectUri.Profiles.Profile.xUri, ProjectUri.xUri),
mp.getResolvedValue()));
}
}
List results = ModelUtils.orderAfterMerge( mergedPlugins, modelPlugins, profileContainer.getPlugins() );
PomTransformer transformer = new PomTransformer( new PomClassicDomainModelFactory() );
ModelTransformerContext ctx = new ModelTransformerContext(PomTransformer.MODEL_CONTAINER_INFOS );
modelContainer.setPlugins( results );
modelContainer.flushPluginMap();
}
PomClassicDomainModel transformedDomainModel;
try {
transformedDomainModel = ( (PomClassicDomainModel) ctx.transform( Arrays.asList( new PomClassicDomainModel(transformed), convertToDomainModel(model)),
transformer,
transformer,
Collections.EMPTY_LIST,
null,
null ) );
return convertFromInputStreamToModel(transformedDomainModel.getInputStream());
} catch (IOException e) {
e.printStackTrace();
return null;
}
private void injectPluginDefinition( Plugin profilePlugin, Plugin modelPlugin )
{
if ( ( profilePlugin == null ) || ( modelPlugin == null ) )
{
// nothing to do.
return;
}
if ( profilePlugin.isExtensions() )
{
modelPlugin.setExtensions( true );
}
if ( profilePlugin.getVersion() != null )
private PomClassicDomainModel convertToDomainModel(Model model) throws IOException
{
modelPlugin.setVersion( profilePlugin.getVersion() );
}
modelPlugin.setDependencies(
injectDependencies( profilePlugin.getDependencies(), modelPlugin.getDependencies() ) );
// merge the lists of goals that are not attached to an <execution/>
injectConfigurationContainer( profilePlugin, modelPlugin );
// from here to the end of the method is dealing with merging of the <executions/> section.
List modelExecutions = modelPlugin.getExecutions();
if ( ( modelExecutions == null ) || modelExecutions.isEmpty() )
if ( model == null )
{
modelPlugin.setExecutions( profilePlugin.getExecutions() );
throw new IllegalArgumentException( "model: null" );
}
else
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = null;
MavenXpp3Writer writer = new MavenXpp3Writer();
try
{
Map executions = new LinkedHashMap();
Map profileExecutions = profilePlugin.getExecutionsAsMap();
for ( Iterator it = modelExecutions.iterator(); it.hasNext(); )
{
PluginExecution modelExecution = (PluginExecution) it.next();
PluginExecution profileExecution = (PluginExecution) profileExecutions.get( modelExecution.getId() );
if ( profileExecution != null )
{
injectConfigurationContainer( profileExecution, modelExecution );
if ( profileExecution.getPhase() != null )
{
modelExecution.setPhase( profileExecution.getPhase() );
out = WriterFactory.newXmlWriter( baos );
writer.write( out, model );
}
List profileGoals = profileExecution.getGoals();
List modelGoals = modelExecution.getGoals();
List goals = new ArrayList();
if ( ( modelGoals != null ) && !modelGoals.isEmpty() )
finally
{
goals.addAll( modelGoals );
}
if ( profileGoals != null )
{
for ( Iterator goalIterator = profileGoals.iterator(); goalIterator.hasNext(); )
{
String goal = (String) goalIterator.next();
if ( !goals.contains( goal ) )
if ( out != null )
{
goals.add( goal );
out.close();
}
}
return new PomClassicDomainModel(new ByteArrayInputStream(baos.toByteArray()));
}
modelExecution.setGoals( goals );
}
executions.put( modelExecution.getId(), modelExecution );
}
for ( Iterator it = profileExecutions.entrySet().iterator(); it.hasNext(); )
private static Model convertFromInputStreamToModel(InputStream inputStream) throws IOException
{
Map.Entry entry = (Map.Entry) it.next();
String id = (String) entry.getKey();
if ( !executions.containsKey( id ) )
try
{
executions.put( id, entry.getValue() );
}
}
modelPlugin.setExecutions( new ArrayList( executions.values() ) );
modelPlugin.flushExecutionMap();
}
return new MavenXpp3Reader().read( ReaderFactory.newXmlReader( inputStream ) );
}
/**
* Merge two DOMs. Copy the dominant DOM so the original one is left unchanged.
* <p/>
* Use this method instead of a direct call to {@link Xpp3Dom#mergeXpp3Dom(Xpp3Dom, Xpp3Dom)}.
* Profiles are dominant, thus they are merge targets, but they may be merged in several times
* (e.g. if they are inherited). So with the second merge, you don't get the profile's original
* DOM, but an already merged one.
*
* @param dominant Dominant DOM
* @param recessive Recessive DOM
* @return Merged DOM
*/
private Xpp3Dom merge( Xpp3Dom dominant, Xpp3Dom recessive )
catch ( XmlPullParserException e )
{
Xpp3Dom dominantCopy = ( dominant == null ) ? null : new Xpp3Dom( dominant );
return Xpp3Dom.mergeXpp3Dom( dominantCopy, recessive );
throw new IOException( e.getMessage() );
}
private void injectConfigurationContainer( ConfigurationContainer profileContainer,
ConfigurationContainer modelContainer )
{
Xpp3Dom configuration = (Xpp3Dom) profileContainer.getConfiguration();
Xpp3Dom parentConfiguration = (Xpp3Dom) modelContainer.getConfiguration();
configuration = merge( configuration, parentConfiguration );
modelContainer.setConfiguration( configuration );
}
/**
* Append modules specified in the profile to the end of the list supplied by the model, if
* they don't already exist.
*/
private void injectModules( Profile profile, Model model )
{
List modules = new ArrayList();
List modelModules = model.getModules();
if ( ( modelModules != null ) && !modelModules.isEmpty() )
{
modules.addAll( modelModules );
}
List profileModules = profile.getModules();
if ( profileModules != null )
{
for ( Iterator it = profileModules.iterator(); it.hasNext(); )
{
String module = (String) it.next();
if ( !modules.contains( module ) )
{
modules.add( module );
}
}
}
model.setModules( modules );
}
private void injectDistributionManagement( Profile profile, Model model )
{
DistributionManagement pDistMgmt = profile.getDistributionManagement();
DistributionManagement mDistMgmt = model.getDistributionManagement();
if ( mDistMgmt == null )
{
model.setDistributionManagement( pDistMgmt );
}
else if ( pDistMgmt != null )
{
if ( pDistMgmt.getRepository() != null )
{
mDistMgmt.setRepository( pDistMgmt.getRepository() );
}
if ( pDistMgmt.getSnapshotRepository() != null )
{
mDistMgmt.setSnapshotRepository( pDistMgmt.getSnapshotRepository() );
}
if ( StringUtils.isNotEmpty( pDistMgmt.getDownloadUrl() ) )
{
mDistMgmt.setDownloadUrl( pDistMgmt.getDownloadUrl() );
}
if ( pDistMgmt.getRelocation() != null )
{
mDistMgmt.setRelocation( pDistMgmt.getRelocation() );
}
if ( pDistMgmt.getSite() != null )
{
mDistMgmt.setSite( pDistMgmt.getSite() );
}
// NOTE: We SHOULD NOT be inheriting status, since this is an assessment of the POM quality.
}
}
private void injectDependencyManagement( Profile profile, Model model )
{
DependencyManagement modelDepMgmt = model.getDependencyManagement();
DependencyManagement profileDepMgmt = profile.getDependencyManagement();
if ( profileDepMgmt != null )
{
if ( modelDepMgmt == null )
{
model.setDependencyManagement( profileDepMgmt );
}
else
{
Map depsMap = new LinkedHashMap();
List deps = modelDepMgmt.getDependencies();
if ( deps != null )
{
for ( Iterator it = deps.iterator(); it.hasNext(); )
{
Dependency dependency = (Dependency) it.next();
depsMap.put( dependency.getManagementKey(), dependency );
}
}
deps = profileDepMgmt.getDependencies();
if ( deps != null )
{
for ( Iterator it = deps.iterator(); it.hasNext(); )
{
Dependency dependency = (Dependency) it.next();
depsMap.put( dependency.getManagementKey(), dependency );
}
}
modelDepMgmt.setDependencies( new ArrayList( depsMap.values() ) );
}
}
}
private void injectReporting( Profile profile, Model model )
{
// Reports :: aggregate
Reporting profileReporting = profile.getReporting();
Reporting modelReporting = model.getReporting();
if ( profileReporting != null )
{
if ( modelReporting == null )
{
model.setReporting( profileReporting );
}
else
{
if ( StringUtils.isEmpty( modelReporting.getOutputDirectory() ) )
{
modelReporting.setOutputDirectory( profileReporting.getOutputDirectory() );
}
Map mergedReportPlugins = new LinkedHashMap();
Map profileReportersByKey = profileReporting.getReportPluginsAsMap();
List modelReportPlugins = modelReporting.getPlugins();
if ( modelReportPlugins != null )
{
for ( Iterator it = modelReportPlugins.iterator(); it.hasNext(); )
{
ReportPlugin modelReportPlugin = (ReportPlugin) it.next();
String inherited = modelReportPlugin.getInherited();
if ( StringUtils.isEmpty( inherited ) || Boolean.valueOf( inherited ).booleanValue() )
{
ReportPlugin profileReportPlugin = (ReportPlugin) profileReportersByKey
.get( modelReportPlugin.getKey() );
ReportPlugin mergedReportPlugin = modelReportPlugin;
if ( profileReportPlugin != null )
{
mergedReportPlugin = profileReportPlugin;
mergeReportPlugins( profileReportPlugin, modelReportPlugin );
}
else if ( StringUtils.isEmpty( inherited ) )
{
mergedReportPlugin.unsetInheritanceApplied();
}
mergedReportPlugins.put( mergedReportPlugin.getKey(), mergedReportPlugin );
}
}
}
for ( Iterator it = profileReportersByKey.entrySet().iterator(); it.hasNext(); )
{
Map.Entry entry = (Map.Entry) it.next();
String key = (String) entry.getKey();
if ( !mergedReportPlugins.containsKey( key ) )
{
mergedReportPlugins.put( key, entry.getValue() );
}
}
modelReporting.setPlugins( new ArrayList( mergedReportPlugins.values() ) );
modelReporting.flushReportPluginMap();
}
}
}
private void mergeReportPlugins( ReportPlugin dominant, ReportPlugin recessive )
{
if ( StringUtils.isEmpty( recessive.getVersion() ) )
{
recessive.setVersion( dominant.getVersion() );
}
Xpp3Dom dominantConfig = (Xpp3Dom) dominant.getConfiguration();
Xpp3Dom recessiveConfig = (Xpp3Dom) recessive.getConfiguration();
recessive.setConfiguration( merge( dominantConfig, recessiveConfig ) );
Map mergedReportSets = new LinkedHashMap();
Map dominantReportSetsById = dominant.getReportSetsAsMap();
for ( Iterator it = recessive.getReportSets().iterator(); it.hasNext(); )
{
ReportSet recessiveReportSet = (ReportSet) it.next();
ReportSet dominantReportSet = (ReportSet) dominantReportSetsById.get( recessiveReportSet.getId() );
ReportSet merged = recessiveReportSet;
if ( dominantReportSet != null )
{
merged = recessiveReportSet;
Xpp3Dom dominantRSConfig = (Xpp3Dom) dominantReportSet.getConfiguration();
Xpp3Dom mergedRSConfig = (Xpp3Dom) merged.getConfiguration();
merged.setConfiguration( merge( dominantRSConfig, mergedRSConfig ) );
List mergedReports = merged.getReports();
if ( mergedReports == null )
{
mergedReports = new ArrayList();
merged.setReports( mergedReports );
}
List dominantRSReports = dominantReportSet.getReports();
if ( dominantRSReports != null )
{
for ( Iterator reportIterator = dominantRSReports.iterator(); reportIterator.hasNext(); )
{
String report = (String) reportIterator.next();
if ( !mergedReports.contains( report ) )
{
mergedReports.add( report );
}
}
}
mergedReportSets.put( merged.getId(), merged );
}
}
for ( Iterator rsIterator = dominantReportSetsById.entrySet().iterator(); rsIterator.hasNext(); )
{
Map.Entry entry = (Map.Entry) rsIterator.next();
String key = (String) entry.getKey();
if ( !mergedReportSets.containsKey( key ) )
{
mergedReportSets.put( key, entry.getValue() );
}
}
recessive.setReportSets( new ArrayList( mergedReportSets.values() ) );
recessive.flushReportSetMap();
}
private List injectDependencies( List profileDeps, List modelDeps )
{
Map depsMap = new LinkedHashMap();
if ( modelDeps != null )
{
for ( Iterator it = modelDeps.iterator(); it.hasNext(); )
{
Dependency dependency = (Dependency) it.next();
depsMap.put( dependency.getManagementKey(), dependency );
}
}
if ( profileDeps != null )
{
for ( Iterator it = profileDeps.iterator(); it.hasNext(); )
{
Dependency dependency = (Dependency) it.next();
depsMap.put( dependency.getManagementKey(), dependency );
}
}
return new ArrayList( depsMap.values() );
}
private static void mergeResourceLists( List childResources, List parentResources )
{
for ( Iterator i = parentResources.iterator(); i.hasNext(); )
{
Resource r = (Resource) i.next();
if ( !childResources.contains( r ) )
{
childResources.add( r );
}
}
}
}

View File

@ -26,6 +26,6 @@ public interface ProfileInjector
{
String ROLE = ProfileInjector.class.getName();
void inject( Profile profile, Model model );
Model inject( Profile profile, Model model );
}

View File

@ -19,13 +19,9 @@ package org.apache.maven.project;
* under the License.
*/
import java.io.File;
import java.io.IOException;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
@ -38,23 +34,30 @@ import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Profile;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
import org.apache.maven.profiles.activation.ProfileActivationContext;
import org.apache.maven.profiles.activation.ProfileActivationException;
import org.apache.maven.profiles.build.ProfileAdvisor;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.project.builder.PomInterpolatorTag;
import org.apache.maven.project.builder.*;
import org.apache.maven.project.builder.profile.ProfileContext;
import org.apache.maven.project.validation.ModelValidationResult;
import org.apache.maven.project.validation.ModelValidator;
import org.apache.maven.repository.MavenRepositorySystem;
import org.apache.maven.repository.VersionNotFoundException;
import org.apache.maven.shared.model.InterpolatorProperty;
import org.apache.maven.shared.model.*;
import org.apache.maven.shared.model.impl.DefaultModelDataSource;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
@ -74,7 +77,7 @@ public class DefaultMavenProjectBuilder
private MavenRepositorySystem repositorySystem;
@Requirement
private ProjectBuilder projectBuilder;
List<ModelEventListener> listeners;
private Logger logger;
@ -117,7 +120,7 @@ public class DefaultMavenProjectBuilder
List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>();
try
{
artifactRepositories.addAll( repositorySystem.buildArtifactRepositories( projectBuilder.getSuperModel().getRepositories() ) );
artifactRepositories.addAll( repositorySystem.buildArtifactRepositories( getSuperModel().getRepositories() ) );
}
catch ( InvalidRepositoryException e )
{
@ -185,7 +188,7 @@ public class DefaultMavenProjectBuilder
List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>( remoteArtifactRepositories );
try
{
artifactRepositories.addAll( repositorySystem.buildArtifactRepositories( projectBuilder.getSuperModel().getRepositories() ) );
artifactRepositories.addAll( repositorySystem.buildArtifactRepositories( getSuperModel().getRepositories() ) );
}
catch ( InvalidRepositoryException e )
{
@ -231,7 +234,7 @@ public class DefaultMavenProjectBuilder
public MavenProject buildStandaloneSuperProject( ProjectBuilderConfiguration config )
throws ProjectBuildingException
{
Model superModel = projectBuilder.getSuperModel();
Model superModel = getSuperModel();
MavenProject project = null;
@ -322,7 +325,7 @@ public class DefaultMavenProjectBuilder
}
else
{
profileActivationContext = new DefaultProfileActivationContext( config.getExecutionProperties(), false );
profileActivationContext = new ProfileActivationContext( config.getExecutionProperties(), false );
}
List<Profile> projectProfiles = new ArrayList<Profile>();
@ -382,7 +385,7 @@ public class DefaultMavenProjectBuilder
try
{
mavenProject = projectBuilder.buildFromLocalPath( projectDescriptor, interpolatorProperties, resolver, config, this );
mavenProject = buildFromLocalPath( projectDescriptor, interpolatorProperties, resolver, config, this );
}
catch ( IOException e )
{
@ -439,4 +442,424 @@ public class DefaultMavenProjectBuilder
setBuildOutputDirectoryOnParent( parent );
}
}
public PomClassicDomainModel buildModel( File pom,
Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver )
throws IOException
{
return buildModel( pom, interpolatorProperties, null, null, resolver );
}
private PomClassicDomainModel buildModel(File pom,
Collection<InterpolatorProperty> interpolatorProperties,
Collection<String> activeProfileIds, Collection<String> inactiveProfileIds,
PomArtifactResolver resolver)
throws IOException
{
if ( pom == null )
{
throw new IllegalArgumentException( "pom: null" );
}
if ( resolver == null )
{
throw new IllegalArgumentException( "resolver: null" );
}
if(activeProfileIds == null)
{
activeProfileIds = new ArrayList<String>();
}
if ( inactiveProfileIds == null )
{
inactiveProfileIds = new ArrayList<String>();
}
List<InterpolatorProperty> properties;
if ( interpolatorProperties == null )
{
properties = new ArrayList<InterpolatorProperty>();
}
else
{
properties = new ArrayList<InterpolatorProperty>( interpolatorProperties );
}
PomClassicDomainModel domainModel = new PomClassicDomainModel( pom );
domainModel.setProjectDirectory( pom.getParentFile() );
List<DomainModel> domainModels = new ArrayList<DomainModel>();
domainModels.add( domainModel );
//Process Profile on most specialized child model
ProfileContext profileContext = new ProfileContext(new DefaultModelDataSource(domainModel.getModelProperties(),
PomTransformer.MODEL_CONTAINER_FACTORIES), activeProfileIds, inactiveProfileIds, properties);
Collection<ModelContainer> profileContainers = profileContext.getActiveProfiles();
for(ModelContainer mc : profileContainers)
{
List<ModelProperty> transformed = new ArrayList<ModelProperty>();
//transformed.add(new ModelProperty(ProjectUri.xUri, null));
for(ModelProperty mp : mc.getProperties())
{
if(mp.getUri().startsWith(ProjectUri.Profiles.Profile.xUri) && !mp.getUri().equals(ProjectUri.Profiles.Profile.id)
&& !mp.getUri().startsWith(ProjectUri.Profiles.Profile.Activation.xUri) )
{
transformed.add(new ModelProperty(mp.getUri().replace(ProjectUri.Profiles.Profile.xUri, ProjectUri.xUri),
mp.getResolvedValue()));
}
}
domainModels.add(new PomClassicDomainModel(transformed));
}
File parentFile = null;
int lineageCount = 0;
if ( domainModel.getParentId() != null )
{
List<DomainModel> mavenParents;
if ( isParentLocal( domainModel.getRelativePathOfParent(), pom.getParentFile() ) )
{
mavenParents =
getDomainModelParentsFromLocalPath( domainModel, resolver, pom.getParentFile(), properties,
activeProfileIds, inactiveProfileIds );
}
else
{
mavenParents =
getDomainModelParentsFromRepository( domainModel, resolver, properties, activeProfileIds,
inactiveProfileIds );
}
if ( mavenParents.size() > 0 )
{
PomClassicDomainModel dm = (PomClassicDomainModel) mavenParents.get( 0 );
parentFile = dm.getFile();
domainModel.setParentFile( parentFile );
lineageCount = mavenParents.size();
}
domainModels.addAll( mavenParents );
}
domainModels.add( convertToDomainModel( getSuperModel() ) );
PomTransformer transformer = new PomTransformer( new PomClassicDomainModelFactory() );
ModelTransformerContext ctx = new ModelTransformerContext(PomTransformer.MODEL_CONTAINER_INFOS );
PomClassicDomainModel transformedDomainModel = ( (PomClassicDomainModel) ctx.transform( domainModels,
transformer,
transformer,
Collections.EMPTY_LIST,
properties,
listeners ) );
// Lineage count is inclusive to add the POM read in itself.
transformedDomainModel.setLineageCount( lineageCount + 1 );
transformedDomainModel.setParentFile( parentFile );
return transformedDomainModel;
}
private PomClassicDomainModel convertToDomainModel(Model model) throws IOException
{
if ( model == null )
{
throw new IllegalArgumentException( "model: null" );
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = null;
MavenXpp3Writer writer = new MavenXpp3Writer();
try
{
out = WriterFactory.newXmlWriter( baos );
writer.write( out, model );
}
finally
{
if ( out != null )
{
out.close();
}
}
return new PomClassicDomainModel(new ByteArrayInputStream(baos.toByteArray()));
}
public MavenProject buildFromLocalPath(File pom,
Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver,
ProjectBuilderConfiguration projectBuilderConfiguration,
MavenProjectBuilder mavenProjectBuilder)
throws IOException
{
List<String> activeProfileIds = (projectBuilderConfiguration != null &&
projectBuilderConfiguration.getGlobalProfileManager() != null &&
projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext() != null) ?
projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext().getExplicitlyActiveProfileIds() : new ArrayList<String>();
List<String> inactiveProfileIds =
( projectBuilderConfiguration != null && projectBuilderConfiguration.getGlobalProfileManager() != null &&
projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext() != null ) ?
projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext().getExplicitlyInactiveProfileIds() : new ArrayList<String>();
PomClassicDomainModel domainModel = buildModel( pom,
interpolatorProperties,
activeProfileIds, inactiveProfileIds,
resolver );
try
{
MavenProject mavenProject = new MavenProject( convertFromInputStreamToModel(domainModel.getInputStream()),
repositorySystem,
mavenProjectBuilder,
projectBuilderConfiguration );
mavenProject.setParentFile( domainModel.getParentFile() );
return mavenProject;
}
catch ( InvalidRepositoryException e )
{
throw new IOException( e.getMessage() );
}
}
private static Model convertFromInputStreamToModel(InputStream inputStream) throws IOException
{
try
{
return new MavenXpp3Reader().read( ReaderFactory.newXmlReader( inputStream ) );
}
catch ( XmlPullParserException e )
{
throw new IOException( e.getMessage() );
}
}
/**
* Returns true if the relative path of the specified parent references a pom, otherwise returns false.
*
* @param relativePath the parent model info
* @param projectDirectory the project directory of the child pom
* @return true if the relative path of the specified parent references a pom, otherwise returns fals
*/
private boolean isParentLocal( String relativePath, File projectDirectory )
{
try
{
File f = new File( projectDirectory, relativePath ).getCanonicalFile();
if ( f.isDirectory() )
{
f = new File( f, "pom.xml" );
}
return f.isFile();
}
catch ( IOException e )
{
return false;
}
}
private List<DomainModel> getDomainModelParentsFromRepository( PomClassicDomainModel domainModel,
PomArtifactResolver artifactResolver,
List<InterpolatorProperty> properties,
Collection<String> activeProfileIds,
Collection<String> inactiveProfileIds )
throws IOException
{
List<DomainModel> domainModels = new ArrayList<DomainModel>();
String parentId = domainModel.getParentId();
if ( parentId == null )
{
return domainModels;
}
Artifact artifactParent = repositorySystem.createParentArtifact( domainModel.getParentGroupId(),
domainModel.getParentArtifactId(), domainModel.getParentVersion() );
artifactResolver.resolve( artifactParent );
PomClassicDomainModel parentDomainModel = new PomClassicDomainModel( artifactParent.getFile() );
if ( !parentDomainModel.matchesParentOf( domainModel ) )
{
logger.debug( "Parent pom ids do not match: Parent File = " + artifactParent.getFile().getAbsolutePath() +
": Child ID = " + domainModel.getId() );
return domainModels;
}
domainModels.add( parentDomainModel );
//Process Profiles
ProfileContext profileContext = new ProfileContext(new DefaultModelDataSource(parentDomainModel.getModelProperties(),
PomTransformer.MODEL_CONTAINER_FACTORIES), activeProfileIds, inactiveProfileIds, properties);
Collection<ModelContainer> profileContainers = profileContext.getActiveProfiles();
for(ModelContainer mc : profileContainers)
{
List<ModelProperty> transformed = new ArrayList<ModelProperty>();
transformed.add(new ModelProperty(ProjectUri.xUri, null));
for(ModelProperty mp : mc.getProperties())
{
if(mp.getUri().startsWith(ProjectUri.Profiles.Profile.xUri) && !mp.getUri().equals(ProjectUri.Profiles.Profile.id)
&& !mp.getUri().startsWith(ProjectUri.Profiles.Profile.Activation.xUri) )
{
transformed.add(new ModelProperty(mp.getUri().replace(ProjectUri.Profiles.Profile.xUri, ProjectUri.xUri),
mp.getResolvedValue()));
}
}
domainModels.add(new PomClassicDomainModel(transformed));
}
domainModels.addAll( getDomainModelParentsFromRepository( parentDomainModel, artifactResolver, properties,
activeProfileIds, inactiveProfileIds ) );
return domainModels;
}
/**
* Returns list of domain model parents of the specified domain model. The parent domain models are part
*
* @param domainModel
* @param artifactResolver
* @param projectDirectory
* @return
* @throws IOException
*/
private List<DomainModel> getDomainModelParentsFromLocalPath( PomClassicDomainModel domainModel,
PomArtifactResolver artifactResolver,
File projectDirectory,
List<InterpolatorProperty> properties,
Collection<String> activeProfileIds,
Collection<String> inactiveProfileIds )
throws IOException
{
List<DomainModel> domainModels = new ArrayList<DomainModel>();
String parentId = domainModel.getParentId();
if ( parentId == null )
{
return domainModels;
}
File parentFile = new File( projectDirectory, domainModel.getRelativePathOfParent() ).getCanonicalFile();
if ( parentFile.isDirectory() )
{
parentFile = new File( parentFile.getAbsolutePath(), "pom.xml" );
}
if ( !parentFile.isFile() )
{
throw new IOException( "File does not exist: File = " + parentFile.getAbsolutePath() );
}
PomClassicDomainModel parentDomainModel = new PomClassicDomainModel( parentFile );
parentDomainModel.setProjectDirectory( parentFile.getParentFile() );
//Process Profiles
ProfileContext profileContext = new ProfileContext(new DefaultModelDataSource(parentDomainModel.getModelProperties(),
PomTransformer.MODEL_CONTAINER_FACTORIES), activeProfileIds, inactiveProfileIds, properties);
Collection<ModelContainer> profileContainers = profileContext.getActiveProfiles();
for(ModelContainer mc : profileContainers)
{
List<ModelProperty> transformed = new ArrayList<ModelProperty>();
transformed.add(new ModelProperty(ProjectUri.xUri, null));
for(ModelProperty mp : mc.getProperties())
{
if(mp.getUri().startsWith(ProjectUri.Profiles.Profile.xUri) && !mp.getUri().equals(ProjectUri.Profiles.Profile.id)
&& !mp.getUri().startsWith(ProjectUri.Profiles.Profile.Activation.xUri))
{
transformed.add(new ModelProperty(mp.getUri().replace(ProjectUri.Profiles.Profile.xUri, ProjectUri.xUri),
mp.getResolvedValue()));
}
}
domainModels.add(new PomClassicDomainModel(transformed));
}
if ( !parentDomainModel.matchesParentOf( domainModel ) )
{
logger.info( "Parent pom ids do not match: Parent File = " + parentFile.getAbsolutePath() + ", Parent ID = "
+ parentDomainModel.getId() + ", Child ID = " + domainModel.getId() + ", Expected Parent ID = "
+ domainModel.getParentId() );
List<DomainModel> parentDomainModels =
getDomainModelParentsFromRepository( domainModel, artifactResolver, properties, activeProfileIds,
inactiveProfileIds );
if(parentDomainModels.size() == 0)
{
throw new IOException("Unable to find parent pom on local path or repo: "
+ domainModel.getParentId());
}
domainModels.addAll( parentDomainModels );
return domainModels;
}
domainModels.add( parentDomainModel );
if ( domainModel.getParentId() != null )
{
if ( isParentLocal(parentDomainModel.getRelativePathOfParent(), parentFile.getParentFile() ) )
{
domainModels.addAll( getDomainModelParentsFromLocalPath( parentDomainModel, artifactResolver,
parentFile.getParentFile(), properties,
activeProfileIds, inactiveProfileIds ) );
}
else
{
domainModels.addAll( getDomainModelParentsFromRepository( parentDomainModel, artifactResolver,
properties, activeProfileIds,
inactiveProfileIds ) );
}
}
return domainModels;
}
private DomainModel superDomainModel;
// Super Model Handling
private static final String MAVEN_MODEL_VERSION = "4.0.0";
private MavenXpp3Reader modelReader = new MavenXpp3Reader();
private Model superModel;
public Model getSuperModel()
{
if ( superModel != null )
{
return superModel;
}
Reader reader = null;
try
{
reader = ReaderFactory.newXmlReader( getClass().getClassLoader().getResource( "org/apache/maven/project/pom-" + MAVEN_MODEL_VERSION + ".xml" ) );
superModel = modelReader.read( reader, true );
}
catch ( Exception e )
{
// Not going to happen we're reading the super pom embedded in the JAR
}
finally
{
IOUtil.close( reader );
}
return superModel;
}
}

View File

@ -1,492 +0,0 @@
package org.apache.maven.project;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.*;
import java.util.*;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.apache.maven.project.builder.*;
import org.apache.maven.project.builder.profile.ProfileContext;
import org.apache.maven.repository.MavenRepositorySystem;
import org.apache.maven.shared.model.*;
import org.apache.maven.shared.model.impl.DefaultModelDataSource;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* Default implementation of the project builder.
*/
@Component(role = ProjectBuilder.class)
public class DefaultProjectBuilder
implements ProjectBuilder, LogEnabled
{
@Requirement
private MavenRepositorySystem repositorySystem;
@Requirement
List<ModelEventListener> listeners;
private Logger logger;
public PomClassicDomainModel buildModel( File pom,
Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver )
throws IOException
{
return buildModel( pom, interpolatorProperties, null, null, resolver );
}
private PomClassicDomainModel buildModel(File pom,
Collection<InterpolatorProperty> interpolatorProperties,
Collection<String> activeProfileIds, Collection<String> inactiveProfileIds,
PomArtifactResolver resolver)
throws IOException
{
if ( pom == null )
{
throw new IllegalArgumentException( "pom: null" );
}
if ( resolver == null )
{
throw new IllegalArgumentException( "resolver: null" );
}
if(activeProfileIds == null)
{
activeProfileIds = new ArrayList<String>();
}
if ( inactiveProfileIds == null )
{
inactiveProfileIds = new ArrayList<String>();
}
List<InterpolatorProperty> properties;
if ( interpolatorProperties == null )
{
properties = new ArrayList<InterpolatorProperty>();
}
else
{
properties = new ArrayList<InterpolatorProperty>( interpolatorProperties );
}
PomClassicDomainModel domainModel = new PomClassicDomainModel( pom );
domainModel.setProjectDirectory( pom.getParentFile() );
List<DomainModel> domainModels = new ArrayList<DomainModel>();
domainModels.add( domainModel );
//Process Profile on most specialized child model
ProfileContext profileContext = new ProfileContext(new DefaultModelDataSource(domainModel.getModelProperties(),
PomTransformer.MODEL_CONTAINER_FACTORIES), activeProfileIds, inactiveProfileIds, properties);
Collection<ModelContainer> profileContainers = profileContext.getActiveProfiles();
for(ModelContainer mc : profileContainers)
{
List<ModelProperty> transformed = new ArrayList<ModelProperty>();
//transformed.add(new ModelProperty(ProjectUri.xUri, null));
for(ModelProperty mp : mc.getProperties())
{
if(mp.getUri().startsWith(ProjectUri.Profiles.Profile.xUri) && !mp.getUri().equals(ProjectUri.Profiles.Profile.id)
&& !mp.getUri().startsWith(ProjectUri.Profiles.Profile.Activation.xUri) )
{
transformed.add(new ModelProperty(mp.getUri().replace(ProjectUri.Profiles.Profile.xUri, ProjectUri.xUri),
mp.getResolvedValue()));
}
}
domainModels.add(new PomClassicDomainModel(transformed));
}
File parentFile = null;
int lineageCount = 0;
if ( domainModel.getParentId() != null )
{
List<DomainModel> mavenParents;
if ( isParentLocal( domainModel.getRelativePathOfParent(), pom.getParentFile() ) )
{
mavenParents =
getDomainModelParentsFromLocalPath( domainModel, resolver, pom.getParentFile(), properties,
activeProfileIds, inactiveProfileIds );
}
else
{
mavenParents =
getDomainModelParentsFromRepository( domainModel, resolver, properties, activeProfileIds,
inactiveProfileIds );
}
if ( mavenParents.size() > 0 )
{
PomClassicDomainModel dm = (PomClassicDomainModel) mavenParents.get( 0 );
parentFile = dm.getFile();
domainModel.setParentFile( parentFile );
lineageCount = mavenParents.size();
}
domainModels.addAll( mavenParents );
}
domainModels.add( convertToDomainModel( getSuperModel() ) );
PomTransformer transformer = new PomTransformer( new PomClassicDomainModelFactory() );
ModelTransformerContext ctx = new ModelTransformerContext(PomTransformer.MODEL_CONTAINER_INFOS );
PomClassicDomainModel transformedDomainModel = ( (PomClassicDomainModel) ctx.transform( domainModels,
transformer,
transformer,
Collections.EMPTY_LIST,
properties,
listeners ) );
// Lineage count is inclusive to add the POM read in itself.
transformedDomainModel.setLineageCount( lineageCount + 1 );
transformedDomainModel.setParentFile( parentFile );
return transformedDomainModel;
}
private PomClassicDomainModel convertToDomainModel(Model model) throws IOException
{
if ( model == null )
{
throw new IllegalArgumentException( "model: null" );
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = null;
MavenXpp3Writer writer = new MavenXpp3Writer();
try
{
out = WriterFactory.newXmlWriter( baos );
writer.write( out, model );
}
finally
{
if ( out != null )
{
out.close();
}
}
return new PomClassicDomainModel(new ByteArrayInputStream(baos.toByteArray()));
}
public MavenProject buildFromLocalPath(File pom,
Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver,
ProjectBuilderConfiguration projectBuilderConfiguration,
MavenProjectBuilder mavenProjectBuilder)
throws IOException
{
List<String> activeProfileIds = (projectBuilderConfiguration != null &&
projectBuilderConfiguration.getGlobalProfileManager() != null &&
projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext() != null) ?
projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext().getExplicitlyActiveProfileIds() : new ArrayList<String>();
List<String> inactiveProfileIds =
( projectBuilderConfiguration != null && projectBuilderConfiguration.getGlobalProfileManager() != null &&
projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext() != null ) ?
projectBuilderConfiguration.getGlobalProfileManager().getProfileActivationContext().getExplicitlyInactiveProfileIds() : new ArrayList<String>();
PomClassicDomainModel domainModel = buildModel( pom,
interpolatorProperties,
activeProfileIds, inactiveProfileIds,
resolver );
try
{
MavenProject mavenProject = new MavenProject( convertFromInputStreamToModel(domainModel.getInputStream()),
repositorySystem,
mavenProjectBuilder,
projectBuilderConfiguration );
mavenProject.setParentFile( domainModel.getParentFile() );
return mavenProject;
}
catch ( InvalidRepositoryException e )
{
throw new IOException( e.getMessage() );
}
}
private static Model convertFromInputStreamToModel(InputStream inputStream) throws IOException
{
try
{
return new MavenXpp3Reader().read( ReaderFactory.newXmlReader( inputStream ) );
}
catch ( XmlPullParserException e )
{
throw new IOException( e.getMessage() );
}
}
/**
* Returns true if the relative path of the specified parent references a pom, otherwise returns false.
*
* @param relativePath the parent model info
* @param projectDirectory the project directory of the child pom
* @return true if the relative path of the specified parent references a pom, otherwise returns fals
*/
private boolean isParentLocal( String relativePath, File projectDirectory )
{
try
{
File f = new File( projectDirectory, relativePath ).getCanonicalFile();
if ( f.isDirectory() )
{
f = new File( f, "pom.xml" );
}
return f.isFile();
}
catch ( IOException e )
{
return false;
}
}
private List<DomainModel> getDomainModelParentsFromRepository( PomClassicDomainModel domainModel,
PomArtifactResolver artifactResolver,
List<InterpolatorProperty> properties,
Collection<String> activeProfileIds,
Collection<String> inactiveProfileIds )
throws IOException
{
List<DomainModel> domainModels = new ArrayList<DomainModel>();
String parentId = domainModel.getParentId();
if ( parentId == null )
{
return domainModels;
}
Artifact artifactParent = repositorySystem.createParentArtifact( domainModel.getParentGroupId(),
domainModel.getParentArtifactId(), domainModel.getParentVersion() );
artifactResolver.resolve( artifactParent );
PomClassicDomainModel parentDomainModel = new PomClassicDomainModel( artifactParent.getFile() );
if ( !parentDomainModel.matchesParentOf( domainModel ) )
{
logger.debug( "Parent pom ids do not match: Parent File = " + artifactParent.getFile().getAbsolutePath() +
": Child ID = " + domainModel.getId() );
return domainModels;
}
domainModels.add( parentDomainModel );
//Process Profiles
ProfileContext profileContext = new ProfileContext(new DefaultModelDataSource(parentDomainModel.getModelProperties(),
PomTransformer.MODEL_CONTAINER_FACTORIES), activeProfileIds, inactiveProfileIds, properties);
Collection<ModelContainer> profileContainers = profileContext.getActiveProfiles();
for(ModelContainer mc : profileContainers)
{
List<ModelProperty> transformed = new ArrayList<ModelProperty>();
transformed.add(new ModelProperty(ProjectUri.xUri, null));
for(ModelProperty mp : mc.getProperties())
{
if(mp.getUri().startsWith(ProjectUri.Profiles.Profile.xUri) && !mp.getUri().equals(ProjectUri.Profiles.Profile.id)
&& !mp.getUri().startsWith(ProjectUri.Profiles.Profile.Activation.xUri) )
{
transformed.add(new ModelProperty(mp.getUri().replace(ProjectUri.Profiles.Profile.xUri, ProjectUri.xUri),
mp.getResolvedValue()));
}
}
domainModels.add(new PomClassicDomainModel(transformed));
}
domainModels.addAll( getDomainModelParentsFromRepository( parentDomainModel, artifactResolver, properties,
activeProfileIds, inactiveProfileIds ) );
return domainModels;
}
/**
* Returns list of domain model parents of the specified domain model. The parent domain models are part
*
* @param domainModel
* @param artifactResolver
* @param projectDirectory
* @return
* @throws IOException
*/
private List<DomainModel> getDomainModelParentsFromLocalPath( PomClassicDomainModel domainModel,
PomArtifactResolver artifactResolver,
File projectDirectory,
List<InterpolatorProperty> properties,
Collection<String> activeProfileIds,
Collection<String> inactiveProfileIds )
throws IOException
{
List<DomainModel> domainModels = new ArrayList<DomainModel>();
String parentId = domainModel.getParentId();
if ( parentId == null )
{
return domainModels;
}
File parentFile = new File( projectDirectory, domainModel.getRelativePathOfParent() ).getCanonicalFile();
if ( parentFile.isDirectory() )
{
parentFile = new File( parentFile.getAbsolutePath(), "pom.xml" );
}
if ( !parentFile.isFile() )
{
throw new IOException( "File does not exist: File = " + parentFile.getAbsolutePath() );
}
PomClassicDomainModel parentDomainModel = new PomClassicDomainModel( parentFile );
parentDomainModel.setProjectDirectory( parentFile.getParentFile() );
//Process Profiles
ProfileContext profileContext = new ProfileContext(new DefaultModelDataSource(parentDomainModel.getModelProperties(),
PomTransformer.MODEL_CONTAINER_FACTORIES), activeProfileIds, inactiveProfileIds, properties);
Collection<ModelContainer> profileContainers = profileContext.getActiveProfiles();
for(ModelContainer mc : profileContainers)
{
List<ModelProperty> transformed = new ArrayList<ModelProperty>();
transformed.add(new ModelProperty(ProjectUri.xUri, null));
for(ModelProperty mp : mc.getProperties())
{
if(mp.getUri().startsWith(ProjectUri.Profiles.Profile.xUri) && !mp.getUri().equals(ProjectUri.Profiles.Profile.id)
&& !mp.getUri().startsWith(ProjectUri.Profiles.Profile.Activation.xUri))
{
transformed.add(new ModelProperty(mp.getUri().replace(ProjectUri.Profiles.Profile.xUri, ProjectUri.xUri),
mp.getResolvedValue()));
}
}
domainModels.add(new PomClassicDomainModel(transformed));
}
if ( !parentDomainModel.matchesParentOf( domainModel ) )
{
logger.info( "Parent pom ids do not match: Parent File = " + parentFile.getAbsolutePath() + ", Parent ID = "
+ parentDomainModel.getId() + ", Child ID = " + domainModel.getId() + ", Expected Parent ID = "
+ domainModel.getParentId() );
List<DomainModel> parentDomainModels =
getDomainModelParentsFromRepository( domainModel, artifactResolver, properties, activeProfileIds,
inactiveProfileIds );
if(parentDomainModels.size() == 0)
{
throw new IOException("Unable to find parent pom on local path or repo: "
+ domainModel.getParentId());
}
domainModels.addAll( parentDomainModels );
return domainModels;
}
domainModels.add( parentDomainModel );
if ( domainModel.getParentId() != null )
{
if ( isParentLocal(parentDomainModel.getRelativePathOfParent(), parentFile.getParentFile() ) )
{
domainModels.addAll( getDomainModelParentsFromLocalPath( parentDomainModel, artifactResolver,
parentFile.getParentFile(), properties,
activeProfileIds, inactiveProfileIds ) );
}
else
{
domainModels.addAll( getDomainModelParentsFromRepository( parentDomainModel, artifactResolver,
properties, activeProfileIds,
inactiveProfileIds ) );
}
}
return domainModels;
}
public void enableLogging( Logger logger )
{
this.logger = logger;
}
private DomainModel superDomainModel;
private DomainModel getSuperDomainModel()
throws IOException
{
if( superDomainModel == null )
{
superDomainModel = convertToDomainModel( getSuperModel() );
}
return ((PomClassicDomainModel) superDomainModel).createCopy();
}
// Super Model Handling
private static final String MAVEN_MODEL_VERSION = "4.0.0";
private MavenXpp3Reader modelReader = new MavenXpp3Reader();
private Model superModel;
public Model getSuperModel()
{
if ( superModel != null )
{
return superModel;
}
Reader reader = null;
try
{
reader = ReaderFactory.newXmlReader( getClass().getClassLoader().getResource( "org/apache/maven/project/pom-" + MAVEN_MODEL_VERSION + ".xml" ) );
superModel = modelReader.read( reader, true );
}
catch ( Exception e )
{
// Not going to happen we're reading the super pom embedded in the JAR
}
finally
{
IOUtil.close( reader );
}
return superModel;
}
}

View File

@ -18,9 +18,14 @@ package org.apache.maven.project;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.project.builder.PomClassicDomainModel;
import org.apache.maven.shared.model.InterpolatorProperty;
import org.apache.maven.model.Model;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Collection;
public interface MavenProjectBuilder
{
@ -47,4 +52,28 @@ public interface MavenProjectBuilder
MavenProject buildStandaloneSuperProject( ProjectBuilderConfiguration configuration )
throws ProjectBuildingException;
PomClassicDomainModel buildModel( File pom,
Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver )
throws IOException;
/**
* Returns a maven project for the specified input stream.
*
* @param pom input stream of the model
* @param interpolatorProperties properties used for interpolation of properties within the model
* @param resolver artifact resolver used in resolving artifacts
* @param projectBuilderConfiguration
* @return a maven project for the specified input stream
* @throws IOException if there is a problem in the construction of the maven project
*/
MavenProject buildFromLocalPath(File pom,
Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver,
ProjectBuilderConfiguration projectBuilderConfiguration,
MavenProjectBuilder mavenProjectBuilder)
throws IOException;
Model getSuperModel();
}

View File

@ -1,59 +0,0 @@
package org.apache.maven.project;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import org.apache.maven.model.Model;
import org.apache.maven.shared.model.InterpolatorProperty;
import org.apache.maven.project.builder.PomClassicDomainModel;
/**
* Provides services for building maven projects from models.
*/
public interface ProjectBuilder
{
public PomClassicDomainModel buildModel( File pom,
Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver )
throws IOException;
/**
* Returns a maven project for the specified input stream.
*
* @param pom input stream of the model
* @param interpolatorProperties properties used for interpolation of properties within the model
* @param resolver artifact resolver used in resolving artifacts
* @param projectBuilderConfiguration
* @return a maven project for the specified input stream
* @throws IOException if there is a problem in the construction of the maven project
*/
MavenProject buildFromLocalPath(File pom,
Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver,
ProjectBuilderConfiguration projectBuilderConfiguration,
MavenProjectBuilder mavenProjectBuilder)
throws IOException;
Model getSuperModel();
}

View File

@ -19,11 +19,9 @@ package org.apache.maven.project.artifact;
* under the License.
*/
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@ -38,16 +36,10 @@ import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException;
import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DistributionManagement;
import org.apache.maven.model.Exclusion;
import org.apache.maven.model.Relocation;
import org.apache.maven.project.DefaultProjectBuilderConfiguration;
import org.apache.maven.project.InvalidProjectModelException;
@ -55,13 +47,11 @@ import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.validation.ModelValidationResult;
import org.apache.maven.repository.MavenRepositoryWrapper;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.StringUtils;
/**
* @author Jason van Zyl

View File

@ -41,117 +41,6 @@ public class DefaultProfileInjectorTest
extends TestCase
{
public void testShouldUseMainPluginDependencyVersionOverManagedDepVersion()
{
PluginContainer profile = new PluginContainer();
Plugin profilePlugin = createPlugin( "group", "artifact", "1", Collections.EMPTY_MAP );
Dependency profileDep = createDependency( "g", "a", "2" );
profilePlugin.addDependency( profileDep );
profile.addPlugin( profilePlugin );
PluginContainer model = new PluginContainer();
Plugin plugin = createPlugin( "group", "artifact", "1", Collections.EMPTY_MAP );
Dependency dep = createDependency( "g", "a", "1" );
plugin.addDependency( dep );
model.addPlugin( plugin );
new DefaultProfileInjector().injectPlugins( profile, model );
assertEquals( profileDep.getVersion(), ((Dependency) plugin.getDependencies().get( 0 ) ).getVersion() );
}
private Dependency createDependency( String gid,
String aid,
String ver )
{
Dependency dep = new Dependency();
dep.setGroupId( gid );
dep.setArtifactId( aid );
dep.setVersion( ver );
return dep;
}
/**
* Test that this is the resulting ordering of plugins after merging:
*
* Given:
*
* model: X -> A -> B -> D -> E
* profile: Y -> A -> C -> D -> F
*
* Result:
*
* X -> Y -> A -> B -> C -> D -> E -> F
*/
public void testShouldPreserveOrderingOfPluginsAfterProfileMerge()
{
PluginContainer profile = new PluginContainer();
profile.addPlugin( createPlugin( "group", "artifact", "1.0", Collections.EMPTY_MAP ) );
profile.addPlugin( createPlugin( "group2", "artifact2", "1.0", Collections.singletonMap( "key", "value" ) ) );
PluginContainer model = new PluginContainer();
model.addPlugin( createPlugin( "group3", "artifact3", "1.0", Collections.EMPTY_MAP ) );
model.addPlugin( createPlugin( "group2", "artifact2", "1.0", Collections.singletonMap( "key2", "value2" ) ) );
new DefaultProfileInjector().injectPlugins( profile, model );
List results = model.getPlugins();
assertEquals( 3, results.size() );
Plugin result1 = (Plugin) results.get( 0 );
assertEquals( "group3", result1.getGroupId() );
assertEquals( "artifact3", result1.getArtifactId() );
Plugin result2 = (Plugin) results.get( 1 );
assertEquals( "group", result2.getGroupId() );
assertEquals( "artifact", result2.getArtifactId() );
Plugin result3 = (Plugin) results.get( 2 );
assertEquals( "group2", result3.getGroupId() );
assertEquals( "artifact2", result3.getArtifactId() );
Xpp3Dom result3Config = (Xpp3Dom) result3.getConfiguration();
assertNotNull( result3Config );
assertEquals( "value", result3Config.getChild( "key" ).getValue() );
assertEquals( "value2", result3Config.getChild( "key2" ).getValue() );
}
private Plugin createPlugin( String groupId, String artifactId, String version, Map configuration )
{
Plugin plugin = new Plugin();
plugin.setGroupId( groupId );
plugin.setArtifactId( artifactId );
plugin.setVersion( version );
Xpp3Dom config = new Xpp3Dom( "configuration" );
if( configuration != null )
{
for ( Iterator it = configuration.entrySet().iterator(); it.hasNext(); )
{
Map.Entry entry = (Map.Entry) it.next();
Xpp3Dom param = new Xpp3Dom( String.valueOf( entry.getKey() ) );
param.setValue( String.valueOf( entry.getValue() ) );
config.addChild( param );
}
}
plugin.setConfiguration( config );
return plugin;
}
public void testProfilePluginConfigurationShouldOverrideCollidingModelPluginConfiguration()
{
Plugin mPlugin = new Plugin();
@ -198,7 +87,7 @@ public class DefaultProfileInjectorTest
profile.setBuild( pBuild );
new DefaultProfileInjector().inject( profile, model );
model = new DefaultProfileInjector().inject( profile, model );
Build rBuild = model.getBuild();
Plugin rPlugin = (Plugin) rBuild.getPlugins().get( 0 );
@ -264,7 +153,7 @@ public class DefaultProfileInjectorTest
profile.setBuild( pBuild );
new DefaultProfileInjector().inject( profile, model );
model = new DefaultProfileInjector().inject( profile, model );
Build rBuild = model.getBuild();
Plugin rPlugin = (Plugin) rBuild.getPlugins().get( 0 );
@ -308,13 +197,14 @@ public class DefaultProfileInjectorTest
profile.addRepository( pRepository );
new DefaultProfileInjector().inject( profile, model );
model = new DefaultProfileInjector().inject( profile, model );
Repository rRepository = (Repository) model.getRepositories().get( 0 );
Repository rRepository = model.getRepositories().get( 0 );
assertEquals( "http://www.yahoo.com", rRepository.getUrl() );
}
/*
public void testShouldPreserveModelModulesWhenProfileHasNone()
{
Model model = new Model();
@ -324,7 +214,7 @@ public class DefaultProfileInjectorTest
Profile profile = new Profile();
profile.setId( "testId" );
new DefaultProfileInjector().inject( profile, model );
model = new DefaultProfileInjector().inject( profile, model );
List rModules = model.getModules();
@ -332,10 +222,6 @@ public class DefaultProfileInjectorTest
assertEquals( "module1", rModules.get( 0 ) );
}
// NOTE: The execution-id's are important, because they are NOT in
// alphabetical order. The trunk version of Maven currently injects
// profiles into a TreeMap, then calls map.values(), which puts the
// executions in alphabetical order...the WRONG order.
public void testShouldPreserveOrderingOfProfileInjectedPluginExecutions()
{
Plugin profilePlugin = new Plugin();
@ -376,7 +262,7 @@ public class DefaultProfileInjectorTest
Model model = new Model();
model.setBuild( build );
new DefaultProfileInjector().inject( profile, model );
model = new DefaultProfileInjector().inject( profile, model );
List plugins = model.getBuild().getPlugins();
assertNotNull( plugins );
@ -403,4 +289,5 @@ public class DefaultProfileInjectorTest
assertEquals( "y", e.getId() );
}
*/
}

View File

@ -25,7 +25,6 @@ import org.apache.maven.model.ActivationProperty;
import org.apache.maven.model.Profile;
import org.apache.maven.profiles.DefaultProfileManager;
import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
import org.apache.maven.profiles.activation.ProfileActivationContext;
import org.codehaus.plexus.PlexusTestCase;
@ -64,7 +63,7 @@ public class DefaultProfileManagerTest
defaultActivated.setActivation( defaultActivation );
Properties props = new Properties();
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
@ -103,7 +102,7 @@ public class DefaultProfileManagerTest
defaultActivated.setActivation( defaultActivation );
Properties props = System.getProperties();
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
@ -133,7 +132,7 @@ public class DefaultProfileManagerTest
syspropActivated.setActivation( syspropActivation );
Properties props = System.getProperties();
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
@ -161,7 +160,7 @@ public class DefaultProfileManagerTest
syspropActivated.setActivation( syspropActivation );
Properties props = System.getProperties();
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
@ -192,7 +191,7 @@ public class DefaultProfileManagerTest
syspropActivated.setActivation( syspropActivation );
Properties props = System.getProperties();
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
@ -223,7 +222,7 @@ public class DefaultProfileManagerTest
osActivated.setActivation( osActivation );
Properties props = System.getProperties();
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );

View File

@ -23,7 +23,6 @@ import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.profiles.DefaultProfileManager;
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
import org.apache.maven.profiles.activation.ProfileActivationContext;
import org.apache.maven.project.validation.ModelValidationResult;
import org.codehaus.plexus.PlexusTestCase;
@ -136,7 +135,7 @@ public abstract class AbstractMavenProjectTestCase
throws Exception
{
Properties props = System.getProperties();
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
ProjectBuilderConfiguration pbc = new DefaultProjectBuilderConfiguration();
pbc.setLocalRepository( getLocalRepository() );

View File

@ -1,15 +1,10 @@
package org.apache.maven.project;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.Profile;
import org.apache.maven.model.Repository;
import org.apache.maven.profiles.DefaultProfileManager;
import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
/*
* Licensed to the Apache Software Foundation (ASF) under one

View File

@ -25,7 +25,6 @@ import java.io.FileInputStream;
import java.util.*;
import org.apache.maven.profiles.DefaultProfileManager;
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
import org.apache.maven.profiles.activation.ProfileActivationContext;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
@ -48,8 +47,6 @@ public class PomConstructionTest
private static String BASE_MIXIN_DIR = BASE_DIR + "/resources-mixins";
private ProjectBuilder projectBuilder;
private MavenProjectBuilder mavenProjectBuilder;
private MavenRepositorySystem mavenTools;
@ -66,7 +63,6 @@ public class PomConstructionTest
testDirectory = new File( getBasedir(), BASE_POM_DIR );
testMixinDirectory = new File( getBasedir(), BASE_MIXIN_DIR );
mavenProjectBuilder = lookup( MavenProjectBuilder.class );
projectBuilder = lookup( ProjectBuilder.class );
mavenTools = lookup( MavenRepositorySystem.class );
pomArtifactResolver = new PomArtifactResolver()
{
@ -133,10 +129,10 @@ public class PomConstructionTest
{
File pom = new File( testDirectory, "micromailer/micromailer-1.0.3.pom" );
PomArtifactResolver resolver = artifactResolver( "micromailer" );
PomClassicDomainModel model = projectBuilder.buildModel( pom, null, resolver );
PomClassicDomainModel model = mavenProjectBuilder.buildModel( pom, null, resolver );
// This should be 2
//assertEquals( 2, model.getLineageCount() );
PomTestWrapper tester = new PomTestWrapper( (PomClassicDomainModel) model );
PomTestWrapper tester = new PomTestWrapper( model );
assertModelEquals( tester, "child-descriptor", "build/plugins[1]/executions[1]/goals[1]" );
}
@ -915,7 +911,7 @@ public class PomConstructionTest
{
pomFile = new File( pomFile, "pom.xml" );
}
return new PomTestWrapper( pomFile, (PomClassicDomainModel) projectBuilder.buildModel( pomFile, null, pomArtifactResolver ) );
return new PomTestWrapper( pomFile, mavenProjectBuilder.buildModel( pomFile, null, pomArtifactResolver ) );
}
private PomTestWrapper buildPomFromMavenProject( String pomPath, String profileId )
@ -928,14 +924,14 @@ public class PomConstructionTest
}
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
config.setLocalRepository(new DefaultArtifactRepository("default", "", new DefaultRepositoryLayout()));
ProfileActivationContext pCtx = new DefaultProfileActivationContext(null, true);
ProfileActivationContext pCtx = new ProfileActivationContext(null, true);
if(profileId != null)
{
pCtx.setExplicitlyActiveProfileIds(Arrays.asList(profileId));
}
config.setGlobalProfileManager(new DefaultProfileManager(this.getContainer(), pCtx));
return new PomTestWrapper( pomFile, projectBuilder.buildFromLocalPath( pomFile, null, pomArtifactResolver,
return new PomTestWrapper( pomFile, mavenProjectBuilder.buildFromLocalPath( pomFile, null, pomArtifactResolver,
config, mavenProjectBuilder ) );
}

View File

@ -29,9 +29,9 @@ public class TestProfileInjector
implements ProfileInjector
{
public void inject( Profile profile, Model model )
public Model inject( Profile profile, Model model )
{
// do nothing.
return null;
}
}