blob: c2f0c89e862eab00b82be5d1719f4016381307f7 [file] [log] [blame]
package org.apache.maven.execution;
/*
* 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.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.monitor.event.EventDispatcher;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.eclipse.aether.RepositorySystemSession;
/**
* A Maven execution session.
*
* @author Jason van Zyl
*/
public class MavenSession
implements Cloneable
{
private MavenExecutionRequest request;
private MavenExecutionResult result;
private RepositorySystemSession repositorySession;
private Properties executionProperties;
private MavenProject currentProject;
/**
* These projects have already been topologically sorted in the {@link org.apache.maven.Maven} component before
* being passed into the session. This is also the potentially constrained set of projects by using --projects
* on the command line.
*/
private List<MavenProject> projects;
/**
* The full set of projects before any potential constraining by --projects. Useful in the case where you want to
* build a smaller set of projects but perform other operations in the context of your reactor.
*/
private List<MavenProject> allProjects;
private MavenProject topLevelProject;
private ProjectDependencyGraph projectDependencyGraph;
private boolean parallel;
/**
* Plugin context keyed by project ({@link MavenProject#getId()}) and by plugin lookup key
* ({@link PluginDescriptor#getPluginLookupKey()}). Plugin contexts itself are mappings of {@link String} keys to
* {@link Object} values.
*/
@SuppressWarnings( "checkstyle:linelength" )
private final ConcurrentMap<String, ConcurrentMap<String, ConcurrentMap<String, Object>>> pluginContextsByProjectAndPluginKey =
new ConcurrentHashMap<>();
public void setProjects( List<MavenProject> projects )
{
if ( !projects.isEmpty() )
{
this.currentProject = projects.get( 0 );
this.topLevelProject = currentProject;
for ( MavenProject project : projects )
{
if ( project.isExecutionRoot() )
{
topLevelProject = project;
break;
}
}
}
else
{
this.currentProject = null;
this.topLevelProject = null;
}
this.projects = projects;
}
public ArtifactRepository getLocalRepository()
{
return request.getLocalRepository();
}
public List<String> getGoals()
{
return request.getGoals();
}
/**
* Gets the user properties to use for interpolation and profile activation. The user properties have been
* configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
* line.
*
* @return The user properties, never {@code null}.
*/
public Properties getUserProperties()
{
return request.getUserProperties();
}
/**
* Gets the system properties to use for interpolation and profile activation. The system properties are collected
* from the runtime environment like {@link System#getProperties()} and environment variables.
*
* @return The system properties, never {@code null}.
*/
public Properties getSystemProperties()
{
return request.getSystemProperties();
}
public Settings getSettings()
{
return settings;
}
public List<MavenProject> getProjects()
{
return projects;
}
public String getExecutionRootDirectory()
{
return request.getBaseDirectory();
}
public MavenExecutionRequest getRequest()
{
return request;
}
public void setCurrentProject( MavenProject currentProject )
{
this.currentProject = currentProject;
}
public MavenProject getCurrentProject()
{
return currentProject;
}
public ProjectBuildingRequest getProjectBuildingRequest()
{
return request.getProjectBuildingRequest().setRepositorySession( getRepositorySession() );
}
public List<String> getPluginGroups()
{
return request.getPluginGroups();
}
public boolean isOffline()
{
return request.isOffline();
}
public MavenProject getTopLevelProject()
{
return topLevelProject;
}
public MavenExecutionResult getResult()
{
return result;
}
// Backward compat
/**
* Returns the plugin context for given key ({@link PluginDescriptor#getPluginLookupKey()} and
* {@link MavenProject}, never returns {@code null} as if context not present, creates it.
*
* <strong>Implementation note:</strong> while this method return type is {@link Map}, the returned map instance
* implements {@link ConcurrentMap} as well.
*
*/
public Map<String, Object> getPluginContext( PluginDescriptor plugin, MavenProject project )
{
String projectKey = project.getId();
ConcurrentMap<String, ConcurrentMap<String, Object>> pluginContextsByKey = pluginContextsByProjectAndPluginKey
.computeIfAbsent( projectKey, k -> new ConcurrentHashMap<>() );
String pluginKey = plugin.getPluginLookupKey();
return pluginContextsByKey.computeIfAbsent( pluginKey, k -> new ConcurrentHashMap<>() );
}
public ProjectDependencyGraph getProjectDependencyGraph()
{
return projectDependencyGraph;
}
public void setProjectDependencyGraph( ProjectDependencyGraph projectDependencyGraph )
{
this.projectDependencyGraph = projectDependencyGraph;
}
public String getReactorFailureBehavior()
{
return request.getReactorFailureBehavior();
}
@Override
public MavenSession clone()
{
try
{
return (MavenSession) super.clone();
}
catch ( CloneNotSupportedException e )
{
throw new RuntimeException( "Bug", e );
}
}
public Date getStartTime()
{
return request.getStartTime();
}
public boolean isParallel()
{
return parallel;
}
public void setParallel( boolean parallel )
{
this.parallel = parallel;
}
public RepositorySystemSession getRepositorySession()
{
return repositorySession;
}
private Map<String, MavenProject> projectMap;
public void setProjectMap( Map<String, MavenProject> projectMap )
{
this.projectMap = projectMap;
}
/** This is a provisional method and may be removed */
public List<MavenProject> getAllProjects()
{
return allProjects;
}
/** This is a provisional method and may be removed */
public void setAllProjects( List<MavenProject> allProjects )
{
this.allProjects = allProjects;
}
/*if_not[MAVEN4]*/
//
// Deprecated
//
private PlexusContainer container;
private final Settings settings;
@Deprecated
/** @deprecated This appears not to be used anywhere within Maven itself. */
public Map<String, MavenProject> getProjectMap()
{
return projectMap;
}
@Deprecated
public MavenSession( PlexusContainer container, RepositorySystemSession repositorySession,
MavenExecutionRequest request, MavenExecutionResult result )
{
this.container = container;
this.request = request;
this.result = result;
this.settings = new SettingsAdapter( request );
this.repositorySession = repositorySession;
}
@Deprecated
public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result,
MavenProject project )
{
this( container, request, result, Arrays.asList( new MavenProject[]{project} ) );
}
@Deprecated
@SuppressWarnings( "checkstyle:parameternumber" )
public MavenSession( PlexusContainer container, Settings settings, ArtifactRepository localRepository,
EventDispatcher eventDispatcher, ReactorManager unused, List<String> goals,
String executionRootDir, Properties executionProperties, Date startTime )
{
this( container, settings, localRepository, eventDispatcher, unused, goals, executionRootDir,
executionProperties, null, startTime );
}
@Deprecated
@SuppressWarnings( "checkstyle:parameternumber" )
public MavenSession( PlexusContainer container, Settings settings, ArtifactRepository localRepository,
EventDispatcher eventDispatcher, ReactorManager unused, List<String> goals,
String executionRootDir, Properties executionProperties, Properties userProperties,
Date startTime )
{
this.container = container;
this.settings = settings;
this.executionProperties = executionProperties;
this.request = new DefaultMavenExecutionRequest();
this.request.setUserProperties( userProperties );
this.request.setLocalRepository( localRepository );
this.request.setGoals( goals );
this.request.setBaseDirectory( ( executionRootDir != null ) ? new File( executionRootDir ) : null );
this.request.setStartTime( startTime );
}
@Deprecated
public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result,
List<MavenProject> projects )
{
this.container = container;
this.request = request;
this.result = result;
this.settings = new SettingsAdapter( request );
setProjects( projects );
}
@Deprecated
public List<MavenProject> getSortedProjects()
{
return getProjects();
}
@Deprecated
//
// Used by Tycho and will break users and force them to upgrade to Maven 3.1 so we should really leave
// this here, possibly indefinitely.
//
public RepositoryCache getRepositoryCache()
{
return null;
}
@Deprecated
public EventDispatcher getEventDispatcher()
{
return null;
}
@Deprecated
public boolean isUsingPOMsFromFilesystem()
{
return request.isProjectPresent();
}
/**
* @deprecated Use either {@link #getUserProperties()} or {@link #getSystemProperties()}.
*/
@Deprecated
public Properties getExecutionProperties()
{
if ( executionProperties == null )
{
executionProperties = new Properties();
executionProperties.putAll( request.getSystemProperties() );
executionProperties.putAll( request.getUserProperties() );
}
return executionProperties;
}
@Deprecated
public PlexusContainer getContainer()
{
return container;
}
@Deprecated
public Object lookup( String role )
throws ComponentLookupException
{
return container.lookup( role );
}
@Deprecated
public Object lookup( String role, String roleHint )
throws ComponentLookupException
{
return container.lookup( role, roleHint );
}
@Deprecated
public List<Object> lookupList( String role )
throws ComponentLookupException
{
return container.lookupList( role );
}
@Deprecated
public Map<String, Object> lookupMap( String role )
throws ComponentLookupException
{
return container.lookupMap( role );
}
/*end[MAVEN4]*/
}