mirror of https://github.com/apache/maven.git
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:
parent
0f4e3cd061
commit
7040079ca9
|
@ -68,7 +68,6 @@ import org.apache.maven.plugin.version.PluginVersionResolutionException;
|
||||||
import org.apache.maven.project.DuplicateArtifactAttachmentException;
|
import org.apache.maven.project.DuplicateArtifactAttachmentException;
|
||||||
import org.apache.maven.project.MavenProject;
|
import org.apache.maven.project.MavenProject;
|
||||||
import org.apache.maven.project.MavenProjectBuilder;
|
import org.apache.maven.project.MavenProjectBuilder;
|
||||||
import org.apache.maven.project.ProjectBuilder;
|
|
||||||
import org.apache.maven.project.ProjectBuildingException;
|
import org.apache.maven.project.ProjectBuildingException;
|
||||||
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
|
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
|
||||||
import org.apache.maven.project.builder.PomInterpolatorTag;
|
import org.apache.maven.project.builder.PomInterpolatorTag;
|
||||||
|
@ -156,9 +155,6 @@ public class DefaultPluginManager
|
||||||
@Requirement
|
@Requirement
|
||||||
private PluginRepository pluginRepository;
|
private PluginRepository pluginRepository;
|
||||||
|
|
||||||
@Requirement
|
|
||||||
private ProjectBuilder projectBuilder;
|
|
||||||
|
|
||||||
public DefaultPluginManager()
|
public DefaultPluginManager()
|
||||||
{
|
{
|
||||||
pluginDescriptorBuilder = new PluginDescriptorBuilder();
|
pluginDescriptorBuilder = new PluginDescriptorBuilder();
|
||||||
|
|
|
@ -40,7 +40,6 @@ import org.apache.maven.monitor.event.DefaultEventMonitor;
|
||||||
import org.apache.maven.monitor.event.EventMonitor;
|
import org.apache.maven.monitor.event.EventMonitor;
|
||||||
import org.apache.maven.profiles.DefaultProfileManager;
|
import org.apache.maven.profiles.DefaultProfileManager;
|
||||||
import org.apache.maven.profiles.ProfileManager;
|
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.ProfileActivationContext;
|
||||||
import org.apache.maven.realm.DefaultMavenRealmManager;
|
import org.apache.maven.realm.DefaultMavenRealmManager;
|
||||||
import org.apache.maven.repository.MavenRepositorySystem;
|
import org.apache.maven.repository.MavenRepositorySystem;
|
||||||
|
@ -568,7 +567,7 @@ public class DefaultMavenExecutionRequestPopulator
|
||||||
ProfileActivationContext activationContext = request.getProfileActivationContext();
|
ProfileActivationContext activationContext = request.getProfileActivationContext();
|
||||||
if ( activationContext == null )
|
if ( activationContext == null )
|
||||||
{
|
{
|
||||||
activationContext = new DefaultProfileActivationContext( request.getProperties(), false );
|
activationContext = new ProfileActivationContext( request.getProperties(), false );
|
||||||
}
|
}
|
||||||
|
|
||||||
activationContext.setExplicitlyActiveProfileIds( request.getActiveProfiles() );
|
activationContext.setExplicitlyActiveProfileIds( request.getActiveProfiles() );
|
||||||
|
|
|
@ -24,7 +24,6 @@ import org.apache.maven.model.Model;
|
||||||
import org.apache.maven.model.Profile;
|
import org.apache.maven.model.Profile;
|
||||||
import org.apache.maven.model.Parent;
|
import org.apache.maven.model.Parent;
|
||||||
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
|
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.ProfileActivationContext;
|
||||||
import org.apache.maven.profiles.activation.ProfileActivationException;
|
import org.apache.maven.profiles.activation.ProfileActivationException;
|
||||||
import org.apache.maven.shared.model.ModelContainer;
|
import org.apache.maven.shared.model.ModelContainer;
|
||||||
|
@ -87,7 +86,7 @@ public class DefaultProfileManager
|
||||||
private ProfileActivationContext createDefaultActivationContext()
|
private ProfileActivationContext createDefaultActivationContext()
|
||||||
{
|
{
|
||||||
|
|
||||||
return new DefaultProfileActivationContext(System.getProperties(), false );
|
return new ProfileActivationContext(System.getProperties(), false );
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProfileActivationContext getProfileActivationContext()
|
public ProfileActivationContext getProfileActivationContext()
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -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.List;
|
||||||
import java.util.Properties;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,599 +20,150 @@ package org.apache.maven.profiles.injection;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.maven.model.*;
|
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.component.annotations.Component;
|
||||||
import org.codehaus.plexus.util.StringUtils;
|
import org.codehaus.plexus.util.xml.pull.XmlSerializer;
|
||||||
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
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.*;
|
||||||
import java.util.Iterator;
|
import java.io.*;
|
||||||
import java.util.LinkedHashMap;
|
import java.lang.reflect.Method;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inject profile data into a Model, using the profile as the dominant data source, and
|
* Inject profile data into a Model, using the profile as the dominant data source, and
|
||||||
* persisting results of the injection in the Model.
|
* 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)
|
@Component(role = ProfileInjector.class)
|
||||||
public class DefaultProfileInjector
|
public class DefaultProfileInjector
|
||||||
implements ProfileInjector
|
implements ProfileInjector
|
||||||
{
|
{
|
||||||
public void inject( Profile profile, Model model )
|
public Model inject( Profile profile, Model model )
|
||||||
{
|
{
|
||||||
|
//TODO: Using reflection now. Need to replace with custom mapper
|
||||||
model.setDependencies( injectDependencies( profile.getDependencies(), model.getDependencies() ) );
|
StringWriter writer = new StringWriter();
|
||||||
|
XmlSerializer serializer = new MXSerializer();
|
||||||
injectModules( profile, model );
|
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " " );
|
||||||
|
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
|
||||||
model.setRepositories( ModelUtils.mergeRepositoryLists( profile.getRepositories(), model.getRepositories() ) );
|
try
|
||||||
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 )
|
|
||||||
{
|
|
||||||
BuildBase profileBuild = profile.getBuild();
|
|
||||||
Build modelBuild = model.getBuild();
|
|
||||||
|
|
||||||
// if the parent build is null, obviously we cannot inherit from it...
|
|
||||||
if ( profileBuild != null )
|
|
||||||
{
|
{
|
||||||
if ( modelBuild == null )
|
serializer.setOutput( writer );
|
||||||
{
|
serializer.startDocument("UTF-8", null );
|
||||||
modelBuild = new Build();
|
} catch (IOException e) {
|
||||||
model.setBuild( modelBuild );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( profileBuild.getDirectory() != null )
|
|
||||||
{
|
|
||||||
modelBuild.setDirectory( profileBuild.getDirectory() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( profileBuild.getDefaultGoal() != null )
|
|
||||||
{
|
|
||||||
modelBuild.setDefaultGoal( profileBuild.getDefaultGoal() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( profileBuild.getFinalName() != null )
|
|
||||||
{
|
|
||||||
modelBuild.setFinalName( profileBuild.getFinalName() );
|
|
||||||
}
|
|
||||||
|
|
||||||
ModelUtils.mergeFilterLists( modelBuild.getFilters(), profileBuild.getFilters() );
|
|
||||||
mergeResourceLists( modelBuild.getResources(), profileBuild.getResources() );
|
|
||||||
mergeResourceLists( modelBuild.getTestResources(), profileBuild.getTestResources() );
|
|
||||||
|
|
||||||
injectPlugins( profileBuild, modelBuild );
|
|
||||||
|
|
||||||
// Plugin management :: aggregate
|
|
||||||
PluginManagement profilePM = profileBuild.getPluginManagement();
|
|
||||||
PluginManagement modelPM = modelBuild.getPluginManagement();
|
|
||||||
|
|
||||||
if ( modelPM == null )
|
|
||||||
{
|
|
||||||
modelBuild.setPluginManagement( profilePM );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
injectPlugins( profilePM, modelPM );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 )
|
|
||||||
{
|
|
||||||
if ( ( profileContainer == null ) || ( modelContainer == null ) )
|
|
||||||
{
|
|
||||||
// nothing to do...
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List modelPlugins = modelContainer.getPlugins();
|
try {
|
||||||
|
MavenXpp3Writer w = new MavenXpp3Writer();
|
||||||
|
Class c = Class.forName("org.apache.maven.model.io.xpp3.MavenXpp3Writer");
|
||||||
|
|
||||||
if ( modelPlugins == null )
|
Class partypes[] = new Class[3];
|
||||||
{
|
partypes[0] = Profile.class;
|
||||||
modelContainer.setPlugins( profileContainer.getPlugins() );
|
partypes[1] = String.class;
|
||||||
|
partypes[2] = XmlSerializer.class;
|
||||||
|
|
||||||
|
Method meth = c.getDeclaredMethod(
|
||||||
|
"writeProfile", partypes);
|
||||||
|
meth.setAccessible(true);
|
||||||
|
|
||||||
|
Object arglist[] = new Object[3];
|
||||||
|
arglist[0] = profile;
|
||||||
|
arglist[1] = "profile";
|
||||||
|
arglist[2] = serializer;
|
||||||
|
|
||||||
|
meth.invoke(w, arglist);
|
||||||
|
serializer.endDocument();
|
||||||
}
|
}
|
||||||
else if ( profileContainer.getPlugins() != null )
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
List mergedPlugins = new ArrayList();
|
return null;
|
||||||
|
}
|
||||||
|
Set<String> uris = new HashSet(PomTransformer.URIS);
|
||||||
|
uris.add(ProjectUri.Profiles.Profile.Build.Plugins.Plugin.configuration);
|
||||||
|
|
||||||
Map profilePlugins = profileContainer.getPluginsAsMap();
|
List<ModelProperty> p;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
p = ModelMarshaller.marshallXmlToModelProperties(new ByteArrayInputStream(writer.getBuffer().toString().getBytes()),
|
||||||
|
ProjectUri.Profiles.xUri, uris);
|
||||||
|
} catch (IOException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
for ( Iterator it = modelPlugins.iterator(); it.hasNext(); )
|
List<ModelProperty> transformed = new ArrayList<ModelProperty>();
|
||||||
|
for(ModelProperty mp : p)
|
||||||
{
|
{
|
||||||
Plugin modelPlugin = (Plugin) it.next();
|
if(mp.getUri().startsWith(ProjectUri.Profiles.Profile.xUri) && !mp.getUri().equals(ProjectUri.Profiles.Profile.id)
|
||||||
|
&& !mp.getUri().startsWith(ProjectUri.Profiles.Profile.Activation.xUri) )
|
||||||
Plugin profilePlugin = (Plugin) profilePlugins.get( modelPlugin.getKey() );
|
|
||||||
|
|
||||||
if ( ( profilePlugin != null ) && !mergedPlugins.contains( profilePlugin ) )
|
|
||||||
{
|
{
|
||||||
Plugin mergedPlugin = modelPlugin;
|
transformed.add(new ModelProperty(mp.getUri().replace(ProjectUri.Profiles.Profile.xUri, ProjectUri.xUri),
|
||||||
|
mp.getResolvedValue()));
|
||||||
injectPluginDefinition( profilePlugin, modelPlugin );
|
|
||||||
|
|
||||||
mergedPlugins.add( mergedPlugin );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 );
|
PomClassicDomainModel transformedDomainModel;
|
||||||
|
try {
|
||||||
modelContainer.flushPluginMap();
|
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 )
|
private PomClassicDomainModel convertToDomainModel(Model model) throws IOException
|
||||||
{
|
{
|
||||||
if ( ( profilePlugin == null ) || ( modelPlugin == null ) )
|
if ( model == null )
|
||||||
{
|
{
|
||||||
// nothing to do.
|
throw new IllegalArgumentException( "model: null" );
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
if ( profilePlugin.isExtensions() )
|
Writer out = null;
|
||||||
|
MavenXpp3Writer writer = new MavenXpp3Writer();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
modelPlugin.setExtensions( true );
|
out = WriterFactory.newXmlWriter( baos );
|
||||||
|
writer.write( out, model );
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
if ( profilePlugin.getVersion() != null )
|
|
||||||
{
|
{
|
||||||
modelPlugin.setVersion( profilePlugin.getVersion() );
|
if ( out != null )
|
||||||
}
|
|
||||||
|
|
||||||
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() )
|
|
||||||
{
|
|
||||||
modelPlugin.setExecutions( profilePlugin.getExecutions() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Map executions = new LinkedHashMap();
|
|
||||||
|
|
||||||
Map profileExecutions = profilePlugin.getExecutionsAsMap();
|
|
||||||
|
|
||||||
for ( Iterator it = modelExecutions.iterator(); it.hasNext(); )
|
|
||||||
{
|
{
|
||||||
PluginExecution modelExecution = (PluginExecution) it.next();
|
out.close();
|
||||||
|
|
||||||
PluginExecution profileExecution = (PluginExecution) profileExecutions.get( modelExecution.getId() );
|
|
||||||
|
|
||||||
if ( profileExecution != null )
|
|
||||||
{
|
|
||||||
injectConfigurationContainer( profileExecution, modelExecution );
|
|
||||||
|
|
||||||
if ( profileExecution.getPhase() != null )
|
|
||||||
{
|
|
||||||
modelExecution.setPhase( profileExecution.getPhase() );
|
|
||||||
}
|
|
||||||
|
|
||||||
List profileGoals = profileExecution.getGoals();
|
|
||||||
List modelGoals = modelExecution.getGoals();
|
|
||||||
|
|
||||||
List goals = new ArrayList();
|
|
||||||
|
|
||||||
if ( ( modelGoals != null ) && !modelGoals.isEmpty() )
|
|
||||||
{
|
|
||||||
goals.addAll( modelGoals );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( profileGoals != null )
|
|
||||||
{
|
|
||||||
for ( Iterator goalIterator = profileGoals.iterator(); goalIterator.hasNext(); )
|
|
||||||
{
|
|
||||||
String goal = (String) goalIterator.next();
|
|
||||||
|
|
||||||
if ( !goals.contains( goal ) )
|
|
||||||
{
|
|
||||||
goals.add( goal );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
modelExecution.setGoals( goals );
|
|
||||||
}
|
|
||||||
|
|
||||||
executions.put( modelExecution.getId(), modelExecution );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( Iterator it = profileExecutions.entrySet().iterator(); it.hasNext(); )
|
|
||||||
{
|
|
||||||
Map.Entry entry = (Map.Entry) it.next();
|
|
||||||
|
|
||||||
String id = (String) entry.getKey();
|
|
||||||
|
|
||||||
if ( !executions.containsKey( id ) )
|
|
||||||
{
|
|
||||||
executions.put( id, entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
modelPlugin.setExecutions( new ArrayList( executions.values() ) );
|
|
||||||
|
|
||||||
modelPlugin.flushExecutionMap();
|
|
||||||
}
|
}
|
||||||
|
return new PomClassicDomainModel(new ByteArrayInputStream(baos.toByteArray()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private static Model convertFromInputStreamToModel(InputStream inputStream) throws IOException
|
||||||
* 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 )
|
|
||||||
{
|
{
|
||||||
Xpp3Dom dominantCopy = ( dominant == null ) ? null : new Xpp3Dom( dominant );
|
|
||||||
return Xpp3Dom.mergeXpp3Dom( dominantCopy, recessive );
|
try
|
||||||
|
{
|
||||||
|
return new MavenXpp3Reader().read( ReaderFactory.newXmlReader( inputStream ) );
|
||||||
|
}
|
||||||
|
catch ( XmlPullParserException e )
|
||||||
|
{
|
||||||
|
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 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,6 @@ public interface ProfileInjector
|
||||||
{
|
{
|
||||||
String ROLE = ProfileInjector.class.getName();
|
String ROLE = ProfileInjector.class.getName();
|
||||||
|
|
||||||
void inject( Profile profile, Model model );
|
Model inject( Profile profile, Model model );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,13 +19,9 @@ package org.apache.maven.project;
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.IOException;
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.maven.artifact.Artifact;
|
import org.apache.maven.artifact.Artifact;
|
||||||
import org.apache.maven.artifact.ArtifactUtils;
|
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.Build;
|
||||||
import org.apache.maven.model.Model;
|
import org.apache.maven.model.Model;
|
||||||
import org.apache.maven.model.Profile;
|
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.ProfileManager;
|
||||||
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
|
|
||||||
import org.apache.maven.profiles.activation.ProfileActivationContext;
|
import org.apache.maven.profiles.activation.ProfileActivationContext;
|
||||||
import org.apache.maven.profiles.activation.ProfileActivationException;
|
import org.apache.maven.profiles.activation.ProfileActivationException;
|
||||||
import org.apache.maven.profiles.build.ProfileAdvisor;
|
import org.apache.maven.profiles.build.ProfileAdvisor;
|
||||||
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
|
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.ModelValidationResult;
|
||||||
import org.apache.maven.project.validation.ModelValidator;
|
import org.apache.maven.project.validation.ModelValidator;
|
||||||
import org.apache.maven.repository.MavenRepositorySystem;
|
import org.apache.maven.repository.MavenRepositorySystem;
|
||||||
import org.apache.maven.repository.VersionNotFoundException;
|
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.Component;
|
||||||
import org.codehaus.plexus.component.annotations.Requirement;
|
import org.codehaus.plexus.component.annotations.Requirement;
|
||||||
import org.codehaus.plexus.logging.LogEnabled;
|
import org.codehaus.plexus.logging.LogEnabled;
|
||||||
import org.codehaus.plexus.logging.Logger;
|
import org.codehaus.plexus.logging.Logger;
|
||||||
import org.codehaus.plexus.util.StringUtils;
|
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;
|
private MavenRepositorySystem repositorySystem;
|
||||||
|
|
||||||
@Requirement
|
@Requirement
|
||||||
private ProjectBuilder projectBuilder;
|
List<ModelEventListener> listeners;
|
||||||
|
|
||||||
private Logger logger;
|
private Logger logger;
|
||||||
|
|
||||||
|
@ -117,7 +120,7 @@ public class DefaultMavenProjectBuilder
|
||||||
List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>();
|
List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
artifactRepositories.addAll( repositorySystem.buildArtifactRepositories( projectBuilder.getSuperModel().getRepositories() ) );
|
artifactRepositories.addAll( repositorySystem.buildArtifactRepositories( getSuperModel().getRepositories() ) );
|
||||||
}
|
}
|
||||||
catch ( InvalidRepositoryException e )
|
catch ( InvalidRepositoryException e )
|
||||||
{
|
{
|
||||||
|
@ -185,7 +188,7 @@ public class DefaultMavenProjectBuilder
|
||||||
List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>( remoteArtifactRepositories );
|
List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>( remoteArtifactRepositories );
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
artifactRepositories.addAll( repositorySystem.buildArtifactRepositories( projectBuilder.getSuperModel().getRepositories() ) );
|
artifactRepositories.addAll( repositorySystem.buildArtifactRepositories( getSuperModel().getRepositories() ) );
|
||||||
}
|
}
|
||||||
catch ( InvalidRepositoryException e )
|
catch ( InvalidRepositoryException e )
|
||||||
{
|
{
|
||||||
|
@ -231,7 +234,7 @@ public class DefaultMavenProjectBuilder
|
||||||
public MavenProject buildStandaloneSuperProject( ProjectBuilderConfiguration config )
|
public MavenProject buildStandaloneSuperProject( ProjectBuilderConfiguration config )
|
||||||
throws ProjectBuildingException
|
throws ProjectBuildingException
|
||||||
{
|
{
|
||||||
Model superModel = projectBuilder.getSuperModel();
|
Model superModel = getSuperModel();
|
||||||
|
|
||||||
MavenProject project = null;
|
MavenProject project = null;
|
||||||
|
|
||||||
|
@ -322,7 +325,7 @@ public class DefaultMavenProjectBuilder
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
profileActivationContext = new DefaultProfileActivationContext( config.getExecutionProperties(), false );
|
profileActivationContext = new ProfileActivationContext( config.getExecutionProperties(), false );
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Profile> projectProfiles = new ArrayList<Profile>();
|
List<Profile> projectProfiles = new ArrayList<Profile>();
|
||||||
|
@ -382,7 +385,7 @@ public class DefaultMavenProjectBuilder
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
mavenProject = projectBuilder.buildFromLocalPath( projectDescriptor, interpolatorProperties, resolver, config, this );
|
mavenProject = buildFromLocalPath( projectDescriptor, interpolatorProperties, resolver, config, this );
|
||||||
}
|
}
|
||||||
catch ( IOException e )
|
catch ( IOException e )
|
||||||
{
|
{
|
||||||
|
@ -439,4 +442,424 @@ public class DefaultMavenProjectBuilder
|
||||||
setBuildOutputDirectoryOnParent( parent );
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -18,9 +18,14 @@ package org.apache.maven.project;
|
||||||
import org.apache.maven.artifact.Artifact;
|
import org.apache.maven.artifact.Artifact;
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.profiles.ProfileManager;
|
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.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
public interface MavenProjectBuilder
|
public interface MavenProjectBuilder
|
||||||
{
|
{
|
||||||
|
@ -47,4 +52,28 @@ public interface MavenProjectBuilder
|
||||||
|
|
||||||
MavenProject buildStandaloneSuperProject( ProjectBuilderConfiguration configuration )
|
MavenProject buildStandaloneSuperProject( ProjectBuilderConfiguration configuration )
|
||||||
throws ProjectBuildingException;
|
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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
|
@ -19,11 +19,9 @@ package org.apache.maven.project.artifact;
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
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.RepositoryMetadata;
|
||||||
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
|
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
|
||||||
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException;
|
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.ArtifactVersion;
|
||||||
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
|
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.artifact.versioning.VersionRange;
|
||||||
import org.apache.maven.model.Dependency;
|
|
||||||
import org.apache.maven.model.DistributionManagement;
|
import org.apache.maven.model.DistributionManagement;
|
||||||
import org.apache.maven.model.Exclusion;
|
|
||||||
import org.apache.maven.model.Relocation;
|
import org.apache.maven.model.Relocation;
|
||||||
import org.apache.maven.project.DefaultProjectBuilderConfiguration;
|
import org.apache.maven.project.DefaultProjectBuilderConfiguration;
|
||||||
import org.apache.maven.project.InvalidProjectModelException;
|
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.MavenProjectBuilder;
|
||||||
import org.apache.maven.project.ProjectBuildingException;
|
import org.apache.maven.project.ProjectBuildingException;
|
||||||
import org.apache.maven.project.validation.ModelValidationResult;
|
import org.apache.maven.project.validation.ModelValidationResult;
|
||||||
import org.apache.maven.repository.MavenRepositoryWrapper;
|
|
||||||
import org.codehaus.plexus.PlexusContainer;
|
import org.codehaus.plexus.PlexusContainer;
|
||||||
import org.codehaus.plexus.component.annotations.Component;
|
import org.codehaus.plexus.component.annotations.Component;
|
||||||
import org.codehaus.plexus.component.annotations.Requirement;
|
import org.codehaus.plexus.component.annotations.Requirement;
|
||||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
||||||
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
import org.codehaus.plexus.util.StringUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Jason van Zyl
|
* @author Jason van Zyl
|
||||||
|
|
|
@ -41,117 +41,6 @@ public class DefaultProfileInjectorTest
|
||||||
extends TestCase
|
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()
|
public void testProfilePluginConfigurationShouldOverrideCollidingModelPluginConfiguration()
|
||||||
{
|
{
|
||||||
Plugin mPlugin = new Plugin();
|
Plugin mPlugin = new Plugin();
|
||||||
|
@ -198,7 +87,7 @@ public class DefaultProfileInjectorTest
|
||||||
|
|
||||||
profile.setBuild( pBuild );
|
profile.setBuild( pBuild );
|
||||||
|
|
||||||
new DefaultProfileInjector().inject( profile, model );
|
model = new DefaultProfileInjector().inject( profile, model );
|
||||||
|
|
||||||
Build rBuild = model.getBuild();
|
Build rBuild = model.getBuild();
|
||||||
Plugin rPlugin = (Plugin) rBuild.getPlugins().get( 0 );
|
Plugin rPlugin = (Plugin) rBuild.getPlugins().get( 0 );
|
||||||
|
@ -264,7 +153,7 @@ public class DefaultProfileInjectorTest
|
||||||
|
|
||||||
profile.setBuild( pBuild );
|
profile.setBuild( pBuild );
|
||||||
|
|
||||||
new DefaultProfileInjector().inject( profile, model );
|
model = new DefaultProfileInjector().inject( profile, model );
|
||||||
|
|
||||||
Build rBuild = model.getBuild();
|
Build rBuild = model.getBuild();
|
||||||
Plugin rPlugin = (Plugin) rBuild.getPlugins().get( 0 );
|
Plugin rPlugin = (Plugin) rBuild.getPlugins().get( 0 );
|
||||||
|
@ -308,13 +197,14 @@ public class DefaultProfileInjectorTest
|
||||||
|
|
||||||
profile.addRepository( pRepository );
|
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() );
|
assertEquals( "http://www.yahoo.com", rRepository.getUrl() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
public void testShouldPreserveModelModulesWhenProfileHasNone()
|
public void testShouldPreserveModelModulesWhenProfileHasNone()
|
||||||
{
|
{
|
||||||
Model model = new Model();
|
Model model = new Model();
|
||||||
|
@ -324,7 +214,7 @@ public class DefaultProfileInjectorTest
|
||||||
Profile profile = new Profile();
|
Profile profile = new Profile();
|
||||||
profile.setId( "testId" );
|
profile.setId( "testId" );
|
||||||
|
|
||||||
new DefaultProfileInjector().inject( profile, model );
|
model = new DefaultProfileInjector().inject( profile, model );
|
||||||
|
|
||||||
List rModules = model.getModules();
|
List rModules = model.getModules();
|
||||||
|
|
||||||
|
@ -332,10 +222,6 @@ public class DefaultProfileInjectorTest
|
||||||
assertEquals( "module1", rModules.get( 0 ) );
|
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()
|
public void testShouldPreserveOrderingOfProfileInjectedPluginExecutions()
|
||||||
{
|
{
|
||||||
Plugin profilePlugin = new Plugin();
|
Plugin profilePlugin = new Plugin();
|
||||||
|
@ -376,7 +262,7 @@ public class DefaultProfileInjectorTest
|
||||||
Model model = new Model();
|
Model model = new Model();
|
||||||
model.setBuild( build );
|
model.setBuild( build );
|
||||||
|
|
||||||
new DefaultProfileInjector().inject( profile, model );
|
model = new DefaultProfileInjector().inject( profile, model );
|
||||||
|
|
||||||
List plugins = model.getBuild().getPlugins();
|
List plugins = model.getBuild().getPlugins();
|
||||||
assertNotNull( plugins );
|
assertNotNull( plugins );
|
||||||
|
@ -403,4 +289,5 @@ public class DefaultProfileInjectorTest
|
||||||
assertEquals( "y", e.getId() );
|
assertEquals( "y", e.getId() );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ import org.apache.maven.model.ActivationProperty;
|
||||||
import org.apache.maven.model.Profile;
|
import org.apache.maven.model.Profile;
|
||||||
import org.apache.maven.profiles.DefaultProfileManager;
|
import org.apache.maven.profiles.DefaultProfileManager;
|
||||||
import org.apache.maven.profiles.ProfileManager;
|
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.ProfileActivationContext;
|
||||||
import org.codehaus.plexus.PlexusTestCase;
|
import org.codehaus.plexus.PlexusTestCase;
|
||||||
|
|
||||||
|
@ -64,7 +63,7 @@ public class DefaultProfileManagerTest
|
||||||
defaultActivated.setActivation( defaultActivation );
|
defaultActivated.setActivation( defaultActivation );
|
||||||
|
|
||||||
Properties props = new Properties();
|
Properties props = new Properties();
|
||||||
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
|
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
|
||||||
|
|
||||||
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
||||||
|
|
||||||
|
@ -103,7 +102,7 @@ public class DefaultProfileManagerTest
|
||||||
defaultActivated.setActivation( defaultActivation );
|
defaultActivated.setActivation( defaultActivation );
|
||||||
|
|
||||||
Properties props = System.getProperties();
|
Properties props = System.getProperties();
|
||||||
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
|
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
|
||||||
|
|
||||||
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
||||||
|
|
||||||
|
@ -133,7 +132,7 @@ public class DefaultProfileManagerTest
|
||||||
syspropActivated.setActivation( syspropActivation );
|
syspropActivated.setActivation( syspropActivation );
|
||||||
|
|
||||||
Properties props = System.getProperties();
|
Properties props = System.getProperties();
|
||||||
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
|
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
|
||||||
|
|
||||||
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
||||||
|
|
||||||
|
@ -161,7 +160,7 @@ public class DefaultProfileManagerTest
|
||||||
syspropActivated.setActivation( syspropActivation );
|
syspropActivated.setActivation( syspropActivation );
|
||||||
|
|
||||||
Properties props = System.getProperties();
|
Properties props = System.getProperties();
|
||||||
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
|
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
|
||||||
|
|
||||||
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
||||||
|
|
||||||
|
@ -192,7 +191,7 @@ public class DefaultProfileManagerTest
|
||||||
syspropActivated.setActivation( syspropActivation );
|
syspropActivated.setActivation( syspropActivation );
|
||||||
|
|
||||||
Properties props = System.getProperties();
|
Properties props = System.getProperties();
|
||||||
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
|
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
|
||||||
|
|
||||||
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
||||||
|
|
||||||
|
@ -223,7 +222,7 @@ public class DefaultProfileManagerTest
|
||||||
osActivated.setActivation( osActivation );
|
osActivated.setActivation( osActivation );
|
||||||
|
|
||||||
Properties props = System.getProperties();
|
Properties props = System.getProperties();
|
||||||
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
|
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
|
||||||
|
|
||||||
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
ProfileManager profileManager = new DefaultProfileManager( getContainer(), ctx );
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@ import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
|
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
|
||||||
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
|
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
|
||||||
import org.apache.maven.profiles.DefaultProfileManager;
|
import org.apache.maven.profiles.DefaultProfileManager;
|
||||||
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
|
|
||||||
import org.apache.maven.profiles.activation.ProfileActivationContext;
|
import org.apache.maven.profiles.activation.ProfileActivationContext;
|
||||||
import org.apache.maven.project.validation.ModelValidationResult;
|
import org.apache.maven.project.validation.ModelValidationResult;
|
||||||
import org.codehaus.plexus.PlexusTestCase;
|
import org.codehaus.plexus.PlexusTestCase;
|
||||||
|
@ -136,7 +135,7 @@ public abstract class AbstractMavenProjectTestCase
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
Properties props = System.getProperties();
|
Properties props = System.getProperties();
|
||||||
ProfileActivationContext ctx = new DefaultProfileActivationContext( props, false );
|
ProfileActivationContext ctx = new ProfileActivationContext( props, false );
|
||||||
|
|
||||||
ProjectBuilderConfiguration pbc = new DefaultProjectBuilderConfiguration();
|
ProjectBuilderConfiguration pbc = new DefaultProjectBuilderConfiguration();
|
||||||
pbc.setLocalRepository( getLocalRepository() );
|
pbc.setLocalRepository( getLocalRepository() );
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
package org.apache.maven.project;
|
package org.apache.maven.project;
|
||||||
|
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.model.Profile;
|
|
||||||
import org.apache.maven.model.Repository;
|
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.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
|
|
@ -25,7 +25,6 @@ import java.io.FileInputStream;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import org.apache.maven.profiles.DefaultProfileManager;
|
import org.apache.maven.profiles.DefaultProfileManager;
|
||||||
import org.apache.maven.profiles.activation.DefaultProfileActivationContext;
|
|
||||||
import org.apache.maven.profiles.activation.ProfileActivationContext;
|
import org.apache.maven.profiles.activation.ProfileActivationContext;
|
||||||
import org.apache.maven.model.Model;
|
import org.apache.maven.model.Model;
|
||||||
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
|
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 static String BASE_MIXIN_DIR = BASE_DIR + "/resources-mixins";
|
||||||
|
|
||||||
private ProjectBuilder projectBuilder;
|
|
||||||
|
|
||||||
private MavenProjectBuilder mavenProjectBuilder;
|
private MavenProjectBuilder mavenProjectBuilder;
|
||||||
|
|
||||||
private MavenRepositorySystem mavenTools;
|
private MavenRepositorySystem mavenTools;
|
||||||
|
@ -66,7 +63,6 @@ public class PomConstructionTest
|
||||||
testDirectory = new File( getBasedir(), BASE_POM_DIR );
|
testDirectory = new File( getBasedir(), BASE_POM_DIR );
|
||||||
testMixinDirectory = new File( getBasedir(), BASE_MIXIN_DIR );
|
testMixinDirectory = new File( getBasedir(), BASE_MIXIN_DIR );
|
||||||
mavenProjectBuilder = lookup( MavenProjectBuilder.class );
|
mavenProjectBuilder = lookup( MavenProjectBuilder.class );
|
||||||
projectBuilder = lookup( ProjectBuilder.class );
|
|
||||||
mavenTools = lookup( MavenRepositorySystem.class );
|
mavenTools = lookup( MavenRepositorySystem.class );
|
||||||
pomArtifactResolver = new PomArtifactResolver()
|
pomArtifactResolver = new PomArtifactResolver()
|
||||||
{
|
{
|
||||||
|
@ -133,10 +129,10 @@ public class PomConstructionTest
|
||||||
{
|
{
|
||||||
File pom = new File( testDirectory, "micromailer/micromailer-1.0.3.pom" );
|
File pom = new File( testDirectory, "micromailer/micromailer-1.0.3.pom" );
|
||||||
PomArtifactResolver resolver = artifactResolver( "micromailer" );
|
PomArtifactResolver resolver = artifactResolver( "micromailer" );
|
||||||
PomClassicDomainModel model = projectBuilder.buildModel( pom, null, resolver );
|
PomClassicDomainModel model = mavenProjectBuilder.buildModel( pom, null, resolver );
|
||||||
// This should be 2
|
// This should be 2
|
||||||
//assertEquals( 2, model.getLineageCount() );
|
//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]" );
|
assertModelEquals( tester, "child-descriptor", "build/plugins[1]/executions[1]/goals[1]" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -915,7 +911,7 @@ public class PomConstructionTest
|
||||||
{
|
{
|
||||||
pomFile = new File( pomFile, "pom.xml" );
|
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 )
|
private PomTestWrapper buildPomFromMavenProject( String pomPath, String profileId )
|
||||||
|
@ -928,14 +924,14 @@ public class PomConstructionTest
|
||||||
}
|
}
|
||||||
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
|
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
|
||||||
config.setLocalRepository(new DefaultArtifactRepository("default", "", new DefaultRepositoryLayout()));
|
config.setLocalRepository(new DefaultArtifactRepository("default", "", new DefaultRepositoryLayout()));
|
||||||
ProfileActivationContext pCtx = new DefaultProfileActivationContext(null, true);
|
ProfileActivationContext pCtx = new ProfileActivationContext(null, true);
|
||||||
if(profileId != null)
|
if(profileId != null)
|
||||||
{
|
{
|
||||||
pCtx.setExplicitlyActiveProfileIds(Arrays.asList(profileId));
|
pCtx.setExplicitlyActiveProfileIds(Arrays.asList(profileId));
|
||||||
}
|
}
|
||||||
|
|
||||||
config.setGlobalProfileManager(new DefaultProfileManager(this.getContainer(), pCtx));
|
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 ) );
|
config, mavenProjectBuilder ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,9 @@ public class TestProfileInjector
|
||||||
implements ProfileInjector
|
implements ProfileInjector
|
||||||
{
|
{
|
||||||
|
|
||||||
public void inject( Profile profile, Model model )
|
public Model inject( Profile profile, Model model )
|
||||||
{
|
{
|
||||||
// do nothing.
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue