blob: d977b06408c406cce0fda53be2ec075f7dfaed55 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2010 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.core.internal.embedder;
import static org.eclipse.m2e.core.internal.M2EUtils.copyProperties;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import org.eclipse.aether.ConfigurationProperties;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.eclipse.aether.transfer.ArtifactNotFoundException;
import org.eclipse.aether.transfer.TransferListener;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.codehaus.plexus.ContainerConfiguration;
import org.codehaus.plexus.DefaultContainerConfiguration;
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
import org.codehaus.plexus.component.configurator.converters.ConfigurationConverter;
import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup;
import org.codehaus.plexus.component.configurator.converters.lookup.DefaultConverterLookup;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.dag.CycleDetectedException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.apache.maven.DefaultMaven;
import org.apache.maven.Maven;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.cli.configuration.SettingsXmlConfigurationProcessor;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequestPopulationException;
import org.apache.maven.execution.MavenExecutionRequestPopulator;
import org.apache.maven.execution.MavenExecutionResult;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.extension.internal.CoreExports;
import org.apache.maven.extension.internal.CoreExtensionEntry;
import org.apache.maven.lifecycle.LifecycleExecutor;
import org.apache.maven.lifecycle.MavenExecutionPlan;
import org.apache.maven.lifecycle.internal.DependencyContext;
import org.apache.maven.lifecycle.internal.LifecycleExecutionPlanCalculator;
import org.apache.maven.lifecycle.internal.MojoExecutor;
import org.apache.maven.model.ConfigurationContainer;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.Profile;
import org.apache.maven.model.Repository;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.model.building.ModelProblemCollector;
import org.apache.maven.model.interpolation.ModelInterpolator;
import org.apache.maven.model.io.ModelReader;
import org.apache.maven.model.io.ModelWriter;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.InvalidPluginDescriptorException;
import org.apache.maven.plugin.MavenPluginManager;
import org.apache.maven.plugin.Mojo;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoNotFoundException;
import org.apache.maven.plugin.PluginConfigurationException;
import org.apache.maven.plugin.PluginContainerException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
import org.apache.maven.plugin.PluginManagerException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
import org.apache.maven.plugin.PluginResolutionException;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.version.DefaultPluginVersionRequest;
import org.apache.maven.plugin.version.PluginVersionRequest;
import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.plugin.version.PluginVersionResolver;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingResult;
import org.apache.maven.project.ProjectSorter;
import org.apache.maven.properties.internal.EnvironmentUtils;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.SettingsUtils;
import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
import org.apache.maven.settings.building.DefaultSettingsProblem;
import org.apache.maven.settings.building.SettingsBuilder;
import org.apache.maven.settings.building.SettingsBuildingException;
import org.apache.maven.settings.building.SettingsBuildingRequest;
import org.apache.maven.settings.building.SettingsProblem;
import org.apache.maven.settings.building.SettingsProblem.Severity;
import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
import org.apache.maven.settings.crypto.SettingsDecrypter;
import org.apache.maven.settings.crypto.SettingsDecryptionRequest;
import org.apache.maven.settings.crypto.SettingsDecryptionResult;
import org.apache.maven.settings.io.SettingsWriter;
import org.apache.maven.wagon.proxy.ProxyInfo;
import org.eclipse.m2e.core.embedder.ICallable;
import org.eclipse.m2e.core.embedder.ILocalRepositoryListener;
import org.eclipse.m2e.core.embedder.IMaven;
import org.eclipse.m2e.core.embedder.IMavenConfiguration;
import org.eclipse.m2e.core.embedder.IMavenConfigurationChangeListener;
import org.eclipse.m2e.core.embedder.IMavenExecutionContext;
import org.eclipse.m2e.core.embedder.ISettingsChangeListener;
import org.eclipse.m2e.core.embedder.MavenConfigurationChangeEvent;
import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.m2e.core.internal.MavenPluginActivator;
import org.eclipse.m2e.core.internal.Messages;
import org.eclipse.m2e.core.internal.NoSuchComponentException;
import org.eclipse.m2e.core.internal.preferences.MavenPreferenceConstants;
public class MavenImpl implements IMaven, IMavenConfigurationChangeListener {
private static final Logger log = LoggerFactory.getLogger(MavenImpl.class);
/**
* Id of maven core class realm
*/
public static final String MAVEN_CORE_REALM_ID = "plexus.core"; //$NON-NLS-1$
private DefaultPlexusContainer plexus;
private final IMavenConfiguration mavenConfiguration;
private final ConverterLookup converterLookup = new DefaultConverterLookup();
private final ArrayList<ISettingsChangeListener> settingsListeners = new ArrayList<ISettingsChangeListener>();
private final ArrayList<ILocalRepositoryListener> localRepositoryListeners = new ArrayList<ILocalRepositoryListener>();
/**
* Cached parsed settings.xml instance
*/
private Settings settings;
/** File length of cached user settings */
private long settings_length;
/** Last modified timestamp of cached user settings */
private long settings_timestamp;
public MavenImpl(IMavenConfiguration mavenConfiguration) {
this.mavenConfiguration = mavenConfiguration;
mavenConfiguration.addConfigurationChangeListener(this);
}
@SuppressWarnings("deprecation")
@Deprecated
public MavenExecutionRequest createExecutionRequest(IProgressMonitor monitor) throws CoreException {
MavenExecutionRequest request = createExecutionRequest();
// logging
request.setTransferListener(createArtifactTransferListener(monitor));
return request;
}
/*package*/MavenExecutionRequest createExecutionRequest() throws CoreException {
MavenExecutionRequest request = new DefaultMavenExecutionRequest();
// this causes problems with unexpected "stale project configuration" error markers
// need to think how to manage ${maven.build.timestamp} properly inside workspace
//request.setStartTime( new Date() );
if(mavenConfiguration.getGlobalSettingsFile() != null) {
request.setGlobalSettingsFile(new File(mavenConfiguration.getGlobalSettingsFile()));
}
File userSettingsFile = SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE;
if(mavenConfiguration.getUserSettingsFile() != null) {
userSettingsFile = new File(mavenConfiguration.getUserSettingsFile());
}
request.setUserSettingsFile(userSettingsFile);
try {
lookup(MavenExecutionRequestPopulator.class).populateFromSettings(request, getSettings());
} catch(MavenExecutionRequestPopulationException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_no_exec_req, ex));
}
ArtifactRepository localRepository = getLocalRepository();
request.setLocalRepository(localRepository);
request.setLocalRepositoryPath(localRepository.getBasedir());
request.setOffline(mavenConfiguration.isOffline());
request.getUserProperties().put("m2e.version", MavenPluginActivator.getVersion()); //$NON-NLS-1$
request.getUserProperties().put(ConfigurationProperties.USER_AGENT, MavenPluginActivator.getUserAgent());
EnvironmentUtils.addEnvVars(request.getSystemProperties());
copyProperties(request.getSystemProperties(), System.getProperties());
request.setCacheNotFound(true);
request.setCacheTransferError(true);
request.setGlobalChecksumPolicy(mavenConfiguration.getGlobalChecksumPolicy());
// the right way to disable snapshot update
// request.setUpdateSnapshots(false);
return request;
}
public String getLocalRepositoryPath() {
String path = null;
try {
Settings settings = getSettings();
path = settings.getLocalRepository();
} catch(CoreException ex) {
// fall through
}
if(path == null) {
path = RepositorySystem.defaultUserLocalRepository.getAbsolutePath();
}
return path;
}
@SuppressWarnings("deprecation")
@Deprecated
public MavenExecutionResult execute(MavenExecutionRequest request, IProgressMonitor monitor) {
// XXX is there a way to set per-request log level?
MavenExecutionResult result;
try {
lookup(MavenExecutionRequestPopulator.class).populateDefaults(request);
result = lookup(Maven.class).execute(request);
} catch(MavenExecutionRequestPopulationException ex) {
result = new DefaultMavenExecutionResult();
result.addException(ex);
} catch(Exception e) {
result = new DefaultMavenExecutionResult();
result.addException(e);
}
return result;
}
@SuppressWarnings("deprecation")
public MavenSession createSession(MavenExecutionRequest request, MavenProject project) {
RepositorySystemSession repoSession = createRepositorySession(request);
MavenExecutionResult result = new DefaultMavenExecutionResult();
MavenSession mavenSession = new MavenSession(plexus, repoSession, request, result);
if(project != null) {
mavenSession.setProjects(Collections.singletonList(project));
}
return mavenSession;
}
/*package*/FilterRepositorySystemSession createRepositorySession(MavenExecutionRequest request) {
try {
DefaultRepositorySystemSession session = (DefaultRepositorySystemSession) ((DefaultMaven) lookup(Maven.class))
.newRepositorySession(request);
final String updatePolicy = mavenConfiguration.getGlobalUpdatePolicy();
return new FilterRepositorySystemSession(session, request.isUpdateSnapshots() ? null : updatePolicy);
} catch(CoreException ex) {
log.error(ex.getMessage(), ex);
throw new IllegalStateException("Could not look up Maven embedder", ex);
}
}
@SuppressWarnings("deprecation")
public void execute(MavenSession session, MojoExecution execution, IProgressMonitor monitor) {
Map<MavenProject, Set<Artifact>> artifacts = new HashMap<MavenProject, Set<Artifact>>();
Map<MavenProject, MavenProjectMutableState> snapshots = new HashMap<MavenProject, MavenProjectMutableState>();
for(MavenProject project : session.getProjects()) {
artifacts.put(project, new LinkedHashSet<Artifact>(project.getArtifacts()));
snapshots.put(project, MavenProjectMutableState.takeSnapshot(project));
}
try {
MojoExecutor mojoExecutor = lookup(MojoExecutor.class);
DependencyContext dependencyContext = mojoExecutor.newDependencyContext(session,
Collections.singletonList(execution));
mojoExecutor.ensureDependenciesAreResolved(execution.getMojoDescriptor(), session, dependencyContext);
lookup(BuildPluginManager.class).executeMojo(session, execution);
} catch(Exception ex) {
session.getResult().addException(ex);
} finally {
for(MavenProject project : session.getProjects()) {
project.setArtifactFilter(null);
project.setResolvedArtifacts(null);
project.setArtifacts(artifacts.get(project));
MavenProjectMutableState snapshot = snapshots.get(project);
if(snapshot != null) {
snapshot.restore(project);
}
}
}
}
public <T> T getConfiguredMojo(MavenSession session, MojoExecution mojoExecution, Class<T> clazz)
throws CoreException {
try {
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
// getPluginRealm creates plugin realm and populates pluginDescriptor.classRealm field
lookup(BuildPluginManager.class).getPluginRealm(session, mojoDescriptor.getPluginDescriptor());
return clazz.cast(lookup(MavenPluginManager.class).getConfiguredMojo(Mojo.class, session, mojoExecution));
} catch(PluginContainerException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_mojo, mojoExecution), ex));
} catch(PluginConfigurationException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_mojo, mojoExecution), ex));
} catch(ClassCastException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_mojo, mojoExecution), ex));
} catch(PluginResolutionException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_mojo, mojoExecution), ex));
} catch(PluginManagerException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_mojo, mojoExecution), ex));
}
}
public void releaseMojo(Object mojo, MojoExecution mojoExecution) throws CoreException {
lookup(MavenPluginManager.class).releaseMojo(mojo, mojoExecution);
}
@SuppressWarnings("deprecation")
public MavenExecutionPlan calculateExecutionPlan(MavenSession session, MavenProject project, List<String> goals,
boolean setup, IProgressMonitor monitor) throws CoreException {
try {
return lookup(LifecycleExecutor.class).calculateExecutionPlan(session, setup,
goals.toArray(new String[goals.size()]));
} catch(Exception ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_calc_build_plan, ex.getMessage()), ex));
}
}
public MavenExecutionPlan calculateExecutionPlan(final MavenProject project, final List<String> goals,
final boolean setup, final IProgressMonitor monitor) throws CoreException {
return context().execute(project,
(context, pm) -> calculateExecutionPlan(context.getSession(), project, goals, setup, pm), monitor);
}
@SuppressWarnings("deprecation")
public MojoExecution setupMojoExecution(MavenSession session, MavenProject project, MojoExecution execution)
throws CoreException {
MojoExecution clone = new MojoExecution(execution.getPlugin(), execution.getGoal(), execution.getExecutionId());
clone.setMojoDescriptor(execution.getMojoDescriptor());
if(execution.getConfiguration() != null) {
clone.setConfiguration(new Xpp3Dom(execution.getConfiguration()));
}
clone.setLifecyclePhase(execution.getLifecyclePhase());
LifecycleExecutionPlanCalculator executionPlanCalculator = lookup(LifecycleExecutionPlanCalculator.class);
try {
executionPlanCalculator.setupMojoExecution(session, project, clone);
} catch(Exception ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_calc_build_plan, ex.getMessage()), ex));
}
return clone;
}
public MojoExecution setupMojoExecution(final MavenProject project, final MojoExecution execution,
IProgressMonitor monitor) throws CoreException {
return context().execute(project, (context, pm) -> setupMojoExecution(context.getSession(), project, execution),
monitor);
}
public ArtifactRepository getLocalRepository() throws CoreException {
try {
String localRepositoryPath = getLocalRepositoryPath();
if(localRepositoryPath != null) {
return lookup(RepositorySystem.class).createLocalRepository(new File(localRepositoryPath));
}
return lookup(RepositorySystem.class).createLocalRepository(RepositorySystem.defaultUserLocalRepository);
} catch(InvalidRepositoryException ex) {
// can't happen
throw new IllegalStateException(ex);
}
}
public Settings getSettings() throws CoreException {
return getSettings(false);
}
public synchronized Settings getSettings(final boolean force_reload) throws CoreException {
// MUST NOT use createRequest!
File userSettingsFile = SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE;
if(mavenConfiguration.getUserSettingsFile() != null) {
userSettingsFile = new File(mavenConfiguration.getUserSettingsFile());
}
boolean reload = force_reload || settings == null;
if(!reload && userSettingsFile != null) {
reload = userSettingsFile.lastModified() != settings_timestamp || userSettingsFile.length() != settings_length;
}
if(reload) {
// TODO: Can't that delegate to buildSettings()?
SettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
// 440696 guard against ConcurrentModificationException
Properties systemProperties = new Properties();
copyProperties(systemProperties, System.getProperties());
request.setSystemProperties(systemProperties);
if(mavenConfiguration.getGlobalSettingsFile() != null) {
request.setGlobalSettingsFile(new File(mavenConfiguration.getGlobalSettingsFile()));
}
if(userSettingsFile != null) {
request.setUserSettingsFile(userSettingsFile);
}
try {
settings = lookup(SettingsBuilder.class).build(request).getEffectiveSettings();
} catch(SettingsBuildingException ex) {
String msg = "Could not read settings.xml, assuming default values";
log.error(msg, ex);
/*
* NOTE: This method provides input for various other core functions, just bailing out would make m2e highly
* unusuable. Instead, we fail gracefully and just ignore the broken settings, using defaults.
*/
settings = new Settings();
}
if(userSettingsFile != null) {
settings_length = userSettingsFile.length();
settings_timestamp = userSettingsFile.lastModified();
}
}
return settings;
}
public Settings buildSettings(String globalSettings, String userSettings) throws CoreException {
SettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
request.setGlobalSettingsFile(globalSettings != null ? new File(globalSettings) : null);
request.setUserSettingsFile(userSettings != null ? new File(userSettings)
: SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE);
try {
return lookup(SettingsBuilder.class).build(request).getEffectiveSettings();
} catch(SettingsBuildingException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_read_settings, ex));
}
}
public void writeSettings(Settings settings, OutputStream out) throws CoreException {
try {
lookup(SettingsWriter.class).write(out, null, settings);
} catch(IOException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_write_settings, ex));
}
}
public List<SettingsProblem> validateSettings(String settings) {
List<SettingsProblem> problems = new ArrayList<SettingsProblem>();
if(settings != null) {
File settingsFile = new File(settings);
if(settingsFile.canRead()) {
SettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
request.setUserSettingsFile(settingsFile);
try {
lookup(SettingsBuilder.class).build(request);
} catch(SettingsBuildingException ex) {
problems.addAll(ex.getProblems());
} catch(CoreException ex) {
problems.add(new DefaultSettingsProblem(ex.getMessage(), Severity.FATAL, settings, -1, -1, ex));
}
} else {
problems.add(new DefaultSettingsProblem(NLS.bind(Messages.MavenImpl_error_read_settings2, settings),
SettingsProblem.Severity.ERROR, settings, -1, -1, null));
}
}
return problems;
}
public void reloadSettings() throws CoreException {
Settings settings = getSettings(true);
for(ISettingsChangeListener listener : settingsListeners) {
try {
listener.settingsChanged(settings);
} catch(CoreException e) {
log.error(e.getMessage(), e);
}
}
}
public Server decryptPassword(Server server) throws CoreException {
SettingsDecryptionRequest request = new DefaultSettingsDecryptionRequest(server);
SettingsDecryptionResult result = lookup(SettingsDecrypter.class).decrypt(request);
for(SettingsProblem problem : result.getProblems()) {
log.warn(problem.getMessage(), problem.getException());
}
return result.getServer();
}
public void mavenConfigurationChange(MavenConfigurationChangeEvent event) throws CoreException {
if(MavenConfigurationChangeEvent.P_USER_SETTINGS_FILE.equals(event.getKey())
|| MavenPreferenceConstants.P_GLOBAL_SETTINGS_FILE.equals(event.getKey())) {
reloadSettings();
}
}
public Model readModel(InputStream in) throws CoreException {
try {
return lookup(ModelReader.class).read(in, null);
} catch(IOException e) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_read_pom, e));
}
}
public Model readModel(File pomFile) throws CoreException {
try {
BufferedInputStream is = new BufferedInputStream(new FileInputStream(pomFile));
try {
return readModel(is);
} finally {
IOUtil.close(is);
}
} catch(IOException e) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_read_pom, e));
}
}
public void writeModel(Model model, OutputStream out) throws CoreException {
try {
lookup(ModelWriter.class).write(out, null, model);
} catch(IOException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_write_pom, ex));
}
}
public MavenProject readProject(final File pomFile, IProgressMonitor monitor) throws CoreException {
return context().execute((context, pm) -> {
MavenExecutionRequest request = DefaultMavenExecutionRequest.copy(context.getExecutionRequest());
try {
lookup(MavenExecutionRequestPopulator.class).populateDefaults(request);
ProjectBuildingRequest configuration = request.getProjectBuildingRequest();
configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
configuration.setRepositorySession(createRepositorySession(request));
return lookup(ProjectBuilder.class).build(pomFile, configuration).getProject();
} catch(ProjectBuildingException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_read_project, ex));
} catch(MavenExecutionRequestPopulationException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_read_project, ex));
}
}, monitor);
}
@SuppressWarnings("deprecation")
public MavenExecutionResult readProject(MavenExecutionRequest request, IProgressMonitor monitor) throws CoreException {
final RepositorySystemSession repositorySession = createRepositorySession(request);
return readMavenProject(request.getPom(), repositorySession, request);
}
@Deprecated
/*package*/MavenExecutionResult readMavenProject(File pomFile, RepositorySystemSession repositorySession,
MavenExecutionRequest request) throws CoreException {
ProjectBuildingRequest configuration = request.getProjectBuildingRequest();
configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
configuration.setRepositorySession(repositorySession);
return readMavenProject(pomFile, configuration);
}
public MavenExecutionResult readMavenProject(File pomFile, ProjectBuildingRequest configuration) throws CoreException {
long start = System.currentTimeMillis();
log.debug("Reading Maven project: {}", pomFile.getAbsoluteFile()); //$NON-NLS-1$
MavenExecutionResult result = new DefaultMavenExecutionResult();
try {
configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
ProjectBuildingResult projectBuildingResult = lookup(ProjectBuilder.class).build(pomFile, configuration);
result.setProject(projectBuildingResult.getProject());
result.setDependencyResolutionResult(projectBuildingResult.getDependencyResolutionResult());
} catch(ProjectBuildingException ex) {
if(ex.getResults() != null && ex.getResults().size() == 1) {
ProjectBuildingResult projectBuildingResult = ex.getResults().get(0);
result.setProject(projectBuildingResult.getProject());
result.setDependencyResolutionResult(projectBuildingResult.getDependencyResolutionResult());
}
result.addException(ex);
} catch(RuntimeException e) {
result.addException(e);
} finally {
log.debug("Read Maven project: {} in {} ms", pomFile.getAbsoluteFile(), System.currentTimeMillis() - start); //$NON-NLS-1$
}
return result;
}
public Map<File, MavenExecutionResult> readMavenProjects(Collection<File> pomFiles,
ProjectBuildingRequest configuration)
throws CoreException {
long start = System.currentTimeMillis();
log.debug("Reading {} Maven project(s): {}", pomFiles.size(), pomFiles.toString()); //$NON-NLS-1$
List<ProjectBuildingResult> projectBuildingResults = null;
Map<File, MavenExecutionResult> result = new LinkedHashMap<>(pomFiles.size(), 1.f);
try {
configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
projectBuildingResults = lookup(ProjectBuilder.class).build(new ArrayList<>(pomFiles),
false,
configuration);
} catch(ProjectBuildingException ex) {
if(ex.getResults() != null) {
projectBuildingResults = ex.getResults();
}
} finally {
log.debug("Read {} Maven project(s) in {} ms",pomFiles.size(),System.currentTimeMillis()-start); //$NON-NLS-1$
}
if(projectBuildingResults != null) {
for (ProjectBuildingResult projectBuildingResult : projectBuildingResults) {
MavenExecutionResult mavenExecutionResult = new DefaultMavenExecutionResult();
mavenExecutionResult.setProject(projectBuildingResult.getProject());
mavenExecutionResult.setDependencyResolutionResult(projectBuildingResult.getDependencyResolutionResult());
if(!projectBuildingResult.getProblems().isEmpty()) {
mavenExecutionResult
.addException(new ProjectBuildingException(Collections.singletonList(projectBuildingResult)));
}
result.put(projectBuildingResult.getPomFile(), mavenExecutionResult);
}
}
return result;
}
/**
* Makes MavenProject instances returned by #readProject methods suitable for caching and reuse with other
* MavenSession instances.<br/>
* Do note that MavenProject.getParentProject() cannot be used for detached MavenProject instances. Use
* #resolveParentProject to resolve parent project instance.
*/
public void detachFromSession(MavenProject project) throws CoreException {
project.getProjectBuildingRequest().setRepositorySession(lookup(ContextRepositorySystemSession.class));
}
@SuppressWarnings("deprecation")
@Deprecated
public MavenProject resolveParentProject(MavenExecutionRequest request, MavenProject child, IProgressMonitor monitor)
throws CoreException {
final ProjectBuildingRequest configuration = request.getProjectBuildingRequest();
final RepositorySystemSession repositorySession = createRepositorySession(request);
return resolveParentProject(repositorySession, child, configuration);
}
/*package*/MavenProject resolveParentProject(RepositorySystemSession repositorySession, MavenProject child,
ProjectBuildingRequest configuration) throws CoreException {
configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
configuration.setRepositorySession(repositorySession);
try {
configuration.setRemoteRepositories(child.getRemoteArtifactRepositories());
File parentFile = child.getParentFile();
if(parentFile == null && child.getParent() != null) { // workaround MNG-6723
parentFile = child.getParent().getFile();
}
if(parentFile != null) {
return lookup(ProjectBuilder.class).build(parentFile, configuration).getProject();
}
Artifact parentArtifact = child.getParentArtifact();
if(parentArtifact != null) {
MavenProject parent = lookup(ProjectBuilder.class).build(parentArtifact, configuration).getProject();
parentFile = parentArtifact.getFile(); // file is resolved as side-effect of the prior call
// compensate for apparent bug in maven 3.0.4 which does not set parent.file and parent.artifact.file
if(parent.getFile() == null) {
parent.setFile(parentFile);
}
if(parent.getArtifact().getFile() == null) {
parent.getArtifact().setFile(parentFile);
}
return parent;
}
} catch(ProjectBuildingException ex) {
log.error("Could not read parent project", ex);
}
return null;
}
public MavenProject resolveParentProject(final MavenProject child, IProgressMonitor monitor) throws CoreException {
return context().execute(child, (context, pm) -> resolveParentProject(context.getRepositorySession(), child,
context.getExecutionRequest().getProjectBuildingRequest()), monitor);
}
public Artifact resolve(String groupId, String artifactId, String version, String type, String classifier,
List<ArtifactRepository> remoteRepositories, IProgressMonitor monitor) throws CoreException {
Artifact artifact = lookup(RepositorySystem.class).createArtifactWithClassifier(groupId, artifactId, version, type,
classifier);
return resolve(artifact, remoteRepositories, monitor);
}
private IMavenExecutionContext context() {
MavenExecutionContext context = MavenExecutionContext.getThreadContext();
if(context == null) {
context = new MavenExecutionContext(this);
}
return context;
}
public Artifact resolve(final Artifact artifact, List<ArtifactRepository> remoteRepositories, IProgressMonitor monitor)
throws CoreException {
if(remoteRepositories == null) {
try {
remoteRepositories = getArtifactRepositories();
} catch(CoreException e) {
// we've tried
remoteRepositories = Collections.emptyList();
}
}
final List<ArtifactRepository> _remoteRepositories = remoteRepositories;
return context().execute((context, pm) -> {
org.eclipse.aether.RepositorySystem repoSystem = lookup(org.eclipse.aether.RepositorySystem.class);
ArtifactRequest request = new ArtifactRequest();
request.setArtifact(RepositoryUtils.toArtifact(artifact));
request.setRepositories(RepositoryUtils.toRepos(_remoteRepositories));
ArtifactResult result;
try {
result = repoSystem.resolveArtifact(context.getRepositorySession(), request);
} catch(ArtifactResolutionException ex) {
result = ex.getResults().get(0);
}
setLastUpdated(context.getLocalRepository(), _remoteRepositories, artifact);
if(result.isResolved()) {
artifact.selectVersion(result.getArtifact().getVersion());
artifact.setFile(result.getArtifact().getFile());
artifact.setResolved(true);
} else {
ArrayList<IStatus> members = new ArrayList<IStatus>();
for(Exception e : result.getExceptions()) {
if(!(e instanceof ArtifactNotFoundException)) {
members.add(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, e.getMessage(), e));
}
}
if(members.isEmpty()) {
members.add(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_missing, artifact), null));
}
IStatus[] newMembers = members.toArray(new IStatus[members.size()]);
throw new CoreException(new MultiStatus(IMavenConstants.PLUGIN_ID, -1, newMembers, NLS.bind(
Messages.MavenImpl_error_resolve, artifact.toString()), null));
}
return artifact;
}, monitor);
}
public Artifact resolvePluginArtifact(Plugin plugin, List<ArtifactRepository> remoteRepositories,
IProgressMonitor monitor) throws CoreException {
Artifact artifact = lookup(RepositorySystem.class).createPluginArtifact(plugin);
return resolve(artifact, remoteRepositories, monitor);
}
public String getArtifactPath(ArtifactRepository repository, String groupId, String artifactId, String version,
String type, String classifier) throws CoreException {
Artifact artifact = lookup(RepositorySystem.class).createArtifactWithClassifier(groupId, artifactId, version, type,
classifier);
return repository.pathOf(artifact);
}
/*package*/void setLastUpdated(ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories,
Artifact artifact) throws CoreException {
Properties lastUpdated = loadLastUpdated(localRepository, artifact);
String timestamp = Long.toString(System.currentTimeMillis());
for(ArtifactRepository repository : remoteRepositories) {
lastUpdated.setProperty(getLastUpdatedKey(repository, artifact), timestamp);
}
File lastUpdatedFile = getLastUpdatedFile(localRepository, artifact);
try {
lastUpdatedFile.getParentFile().mkdirs();
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(lastUpdatedFile));
try {
lastUpdated.store(os, null);
} finally {
IOUtil.close(os);
}
} catch(IOException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_write_lastUpdated, ex));
}
}
/**
* This is a temporary implementation that only works for artifacts resolved using #resolve.
*/
public boolean isUnavailable(String groupId, String artifactId, String version, String type, String classifier,
List<ArtifactRepository> remoteRepositories) throws CoreException {
Artifact artifact = lookup(RepositorySystem.class).createArtifactWithClassifier(groupId, artifactId, version, type,
classifier);
ArtifactRepository localRepository = getLocalRepository();
File artifactFile = new File(localRepository.getBasedir(), localRepository.pathOf(artifact));
if(artifactFile.canRead()) {
// artifact is available locally
return false;
}
if(remoteRepositories == null || remoteRepositories.isEmpty()) {
// no remote repositories
return true;
}
// now is the hard part
Properties lastUpdated = loadLastUpdated(localRepository, artifact);
for(ArtifactRepository repository : remoteRepositories) {
String timestamp = lastUpdated.getProperty(getLastUpdatedKey(repository, artifact));
if(timestamp == null) {
// availability of the artifact from this repository has not been checked yet
return false;
}
}
// artifact is not available locally and all remote repositories have been checked in the past
return true;
}
private String getLastUpdatedKey(ArtifactRepository repository, Artifact artifact) {
StringBuilder key = new StringBuilder();
// repository part
key.append(repository.getId());
if(repository.getAuthentication() != null) {
key.append('|').append(repository.getAuthentication().getUsername());
}
key.append('|').append(repository.getUrl());
// artifact part
key.append('|').append(artifact.getClassifier());
return key.toString();
}
private Properties loadLastUpdated(ArtifactRepository localRepository, Artifact artifact) throws CoreException {
Properties lastUpdated = new Properties();
File lastUpdatedFile = getLastUpdatedFile(localRepository, artifact);
try {
BufferedInputStream is = new BufferedInputStream(new FileInputStream(lastUpdatedFile));
try {
lastUpdated.load(is);
} finally {
IOUtil.close(is);
}
} catch(FileNotFoundException ex) {
// that's okay
} catch(IOException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_read_lastUpdated, ex));
}
return lastUpdated;
}
private File getLastUpdatedFile(ArtifactRepository localRepository, Artifact artifact) {
return new File(localRepository.getBasedir(), basePathOf(localRepository, artifact) + "/" //$NON-NLS-1$
+ "m2e-lastUpdated.properties"); //$NON-NLS-1$
}
private static final char PATH_SEPARATOR = '/';
private static final char GROUP_SEPARATOR = '.';
private String basePathOf(ArtifactRepository repository, Artifact artifact) {
StringBuilder path = new StringBuilder(128);
path.append(formatAsDirectory(artifact.getGroupId())).append(PATH_SEPARATOR);
path.append(artifact.getArtifactId()).append(PATH_SEPARATOR);
path.append(artifact.getBaseVersion()).append(PATH_SEPARATOR);
return path.toString();
}
private String formatAsDirectory(String directory) {
return directory.replace(GROUP_SEPARATOR, PATH_SEPARATOR);
}
@SuppressWarnings("deprecation")
public <T> T getMojoParameterValue(MavenSession session, MojoExecution mojoExecution, String parameter,
Class<T> asType) throws CoreException {
try {
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
ClassRealm pluginRealm = lookup(BuildPluginManager.class).getPluginRealm(session,
mojoDescriptor.getPluginDescriptor());
ExpressionEvaluator expressionEvaluator = new PluginParameterExpressionEvaluator(session, mojoExecution);
ConfigurationConverter typeConverter = converterLookup.lookupConverterForType(asType);
Xpp3Dom dom = mojoExecution.getConfiguration();
if(dom == null) {
return null;
}
PlexusConfiguration pomConfiguration = new XmlPlexusConfiguration(dom);
PlexusConfiguration configuration = pomConfiguration.getChild(parameter);
if(configuration == null) {
return null;
}
Object value = typeConverter.fromConfiguration(converterLookup, configuration, asType,
mojoDescriptor.getImplementationClass(), pluginRealm, expressionEvaluator, null);
return asType.cast(value);
} catch(Exception e) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, NLS.bind(
Messages.MavenImpl_error_param_for_execution, parameter, mojoExecution.getExecutionId()), e));
}
}
public <T> T getMojoParameterValue(final MavenProject project, final MojoExecution mojoExecution,
final String parameter, final Class<T> asType, final IProgressMonitor monitor) throws CoreException {
return context().execute(project,
(context, pm) -> getMojoParameterValue(context.getSession(), mojoExecution, parameter, asType), monitor);
}
@SuppressWarnings("deprecation")
public <T> T getMojoParameterValue(String parameter, Class<T> type, MavenSession session, Plugin plugin,
ConfigurationContainer configuration, String goal) throws CoreException {
Xpp3Dom config = (Xpp3Dom) configuration.getConfiguration();
config = (config != null) ? config.getChild(parameter) : null;
PlexusConfiguration paramConfig = null;
if(config == null) {
MojoDescriptor mojoDescriptor;
try {
mojoDescriptor = lookup(BuildPluginManager.class).getMojoDescriptor(plugin, goal,
session.getCurrentProject().getRemotePluginRepositories(), session.getRepositorySession());
} catch(PluginNotFoundException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_param, ex));
} catch(PluginResolutionException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_param, ex));
} catch(PluginDescriptorParsingException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_param, ex));
} catch(MojoNotFoundException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_param, ex));
} catch(InvalidPluginDescriptorException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_param, ex));
}
PlexusConfiguration defaultConfig = mojoDescriptor.getMojoConfiguration();
if(defaultConfig != null) {
paramConfig = defaultConfig.getChild(parameter, false);
}
} else {
paramConfig = new XmlPlexusConfiguration(config);
}
if(paramConfig == null) {
return null;
}
try {
MojoExecution mojoExecution = new MojoExecution(plugin, goal, "default"); //$NON-NLS-1$
ExpressionEvaluator expressionEvaluator = new PluginParameterExpressionEvaluator(session, mojoExecution);
ConfigurationConverter typeConverter = converterLookup.lookupConverterForType(type);
Object value = typeConverter.fromConfiguration(converterLookup, paramConfig, type, Object.class,
plexus.getContainerRealm(), expressionEvaluator, null);
return type.cast(value);
} catch(ComponentConfigurationException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, Messages.MavenImpl_error_param,
ex));
} catch(ClassCastException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, Messages.MavenImpl_error_param,
ex));
}
}
public <T> T getMojoParameterValue(final MavenProject project, final String parameter, final Class<T> type,
final Plugin plugin, final ConfigurationContainer configuration, final String goal, IProgressMonitor monitor)
throws CoreException {
return context().execute(project,
(context, pm) -> getMojoParameterValue(parameter, type, context.getSession(), plugin, configuration, goal),
monitor);
}
public ArtifactRepository createArtifactRepository(String id, String url) throws CoreException {
Repository repository = new Repository();
repository.setId(id);
repository.setUrl(url);
repository.setLayout("default"); //$NON-NLS-1$
ArtifactRepository repo;
try {
repo = lookup(RepositorySystem.class).buildArtifactRepository(repository);
ArrayList<ArtifactRepository> repos = new ArrayList<ArtifactRepository>(Arrays.asList(repo));
injectSettings(repos);
} catch(InvalidRepositoryException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_create_repo, ex));
}
return repo;
}
public List<ArtifactRepository> getArtifactRepositories() throws CoreException {
return getArtifactRepositories(true);
}
public List<ArtifactRepository> getArtifactRepositories(boolean injectSettings) throws CoreException {
ArrayList<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
for(Profile profile : getActiveProfiles()) {
addArtifactRepositories(repositories, profile.getRepositories());
}
addDefaultRepository(repositories);
if(injectSettings) {
injectSettings(repositories);
}
return removeDuplicateRepositories(repositories);
}
private List<ArtifactRepository> removeDuplicateRepositories(ArrayList<ArtifactRepository> repositories) {
ArrayList<ArtifactRepository> result = new ArrayList<ArtifactRepository>();
HashSet<String> keys = new HashSet<String>();
for(ArtifactRepository repository : repositories) {
StringBuilder key = new StringBuilder();
if(repository.getId() != null) {
key.append(repository.getId());
}
key.append(':').append(repository.getUrl()).append(':');
if(repository.getAuthentication() != null && repository.getAuthentication().getUsername() != null) {
key.append(repository.getAuthentication().getUsername());
}
if(keys.add(key.toString())) {
result.add(repository);
}
}
return result;
}
private void injectSettings(ArrayList<ArtifactRepository> repositories) throws CoreException {
Settings settings = getSettings();
RepositorySystem repositorySystem = lookup(RepositorySystem.class);
repositorySystem.injectMirror(repositories, getMirrors());
repositorySystem.injectProxy(repositories, settings.getProxies());
repositorySystem.injectAuthentication(repositories, settings.getServers());
}
private void addDefaultRepository(ArrayList<ArtifactRepository> repositories) throws CoreException {
for(ArtifactRepository repository : repositories) {
if(RepositorySystem.DEFAULT_REMOTE_REPO_ID.equals(repository.getId())) {
return;
}
}
try {
repositories.add(0, lookup(RepositorySystem.class).createDefaultRemoteRepository());
} catch(InvalidRepositoryException ex) {
log.error("Unexpected exception", ex);
}
}
private void addArtifactRepositories(ArrayList<ArtifactRepository> artifactRepositories, List<Repository> repositories)
throws CoreException {
for(Repository repository : repositories) {
try {
ArtifactRepository artifactRepository = lookup(RepositorySystem.class).buildArtifactRepository(repository);
artifactRepositories.add(artifactRepository);
} catch(InvalidRepositoryException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_read_settings, ex));
}
}
}
private List<Profile> getActiveProfiles() throws CoreException {
Settings settings = getSettings();
List<String> activeProfilesIds = settings.getActiveProfiles();
ArrayList<Profile> activeProfiles = new ArrayList<Profile>();
for(org.apache.maven.settings.Profile settingsProfile : settings.getProfiles()) {
if((settingsProfile.getActivation() != null && settingsProfile.getActivation().isActiveByDefault())
|| activeProfilesIds.contains(settingsProfile.getId())) {
Profile profile = SettingsUtils.convertFromSettingsProfile(settingsProfile);
activeProfiles.add(profile);
}
}
return activeProfiles;
}
public List<ArtifactRepository> getPluginArtifactRepositories() throws CoreException {
return getPluginArtifactRepositories(true);
}
public List<ArtifactRepository> getPluginArtifactRepositories(boolean injectSettings) throws CoreException {
ArrayList<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
for(Profile profile : getActiveProfiles()) {
addArtifactRepositories(repositories, profile.getPluginRepositories());
}
addDefaultRepository(repositories);
if(injectSettings) {
injectSettings(repositories);
}
return removeDuplicateRepositories(repositories);
}
public Mirror getMirror(ArtifactRepository repo) throws CoreException {
MavenExecutionRequest request = createExecutionRequest(new NullProgressMonitor());
populateDefaults(request);
return lookup(RepositorySystem.class).getMirror(repo, request.getMirrors());
};
public void populateDefaults(MavenExecutionRequest request) throws CoreException {
try {
lookup(MavenExecutionRequestPopulator.class).populateDefaults(request);
} catch(MavenExecutionRequestPopulationException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_read_config, ex));
}
}
public List<Mirror> getMirrors() throws CoreException {
MavenExecutionRequest request = createExecutionRequest(null);
populateDefaults(request);
return request.getMirrors();
}
public void addSettingsChangeListener(ISettingsChangeListener listener) {
settingsListeners.add(listener);
}
public void removeSettingsChangeListener(ISettingsChangeListener listener) {
settingsListeners.remove(listener);
}
public void addLocalRepositoryListener(ILocalRepositoryListener listener) {
localRepositoryListeners.add(listener);
}
public void removeLocalRepositoryListener(ILocalRepositoryListener listener) {
localRepositoryListeners.remove(listener);
}
public List<ILocalRepositoryListener> getLocalRepositoryListeners() {
return localRepositoryListeners;
}
@SuppressWarnings("deprecation")
public WagonTransferListenerAdapter createTransferListener(IProgressMonitor monitor) {
return new WagonTransferListenerAdapter(this, monitor);
}
public TransferListener createArtifactTransferListener(IProgressMonitor monitor) {
return new ArtifactTransferListenerAdapter(this, monitor);
}
public PlexusContainer getPlexusContainer() throws CoreException {
try {
return getPlexusContainer0();
} catch(PlexusContainerException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1,
Messages.MavenImpl_error_init_maven, ex));
}
}
private synchronized PlexusContainer getPlexusContainer0() throws PlexusContainerException {
if(plexus == null) {
plexus = newPlexusContainer();
plexus.setLoggerManager(new EclipseLoggerManager(mavenConfiguration));
}
return plexus;
}
public ProxyInfo getProxyInfo(String protocol) throws CoreException {
Settings settings = getSettings();
for(Proxy proxy : settings.getProxies()) {
if(proxy.isActive() && protocol.equalsIgnoreCase(proxy.getProtocol())) {
ProxyInfo proxyInfo = new ProxyInfo();
proxyInfo.setType(proxy.getProtocol());
proxyInfo.setHost(proxy.getHost());
proxyInfo.setPort(proxy.getPort());
proxyInfo.setNonProxyHosts(proxy.getNonProxyHosts());
proxyInfo.setUserName(proxy.getUsername());
proxyInfo.setPassword(proxy.getPassword());
return proxyInfo;
}
}
return null;
}
public List<MavenProject> getSortedProjects(List<MavenProject> projects) throws CoreException {
try {
ProjectSorter rm = new ProjectSorter(projects);
return rm.getSortedProjects();
} catch(CycleDetectedException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, Messages.MavenImpl_error_sort, ex));
} catch(DuplicateProjectException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, Messages.MavenImpl_error_sort, ex));
}
}
public String resolvePluginVersion(String groupId, String artifactId, MavenSession session) throws CoreException {
Plugin plugin = new Plugin();
plugin.setGroupId(groupId);
plugin.setArtifactId(artifactId);
PluginVersionRequest request = new DefaultPluginVersionRequest(plugin, session);
try {
return lookup(PluginVersionResolver.class).resolve(request).getVersion();
} catch(PluginVersionResolutionException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, ex.getMessage(), ex));
}
}
public <T> T lookup(Class<T> clazz) throws CoreException {
try {
return getPlexusContainer().lookup(clazz);
} catch(ComponentLookupException ex) {
throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, -1, Messages.MavenImpl_error_lookup,
ex));
}
}
/**
* @since 1.5
*/
public <T> T lookupComponent(Class<T> clazz) {
try {
return getPlexusContainer0().lookup(clazz);
} catch(ComponentLookupException ex) {
throw new NoSuchComponentException(ex);
} catch(PlexusContainerException ex) {
throw new IllegalStateException(ex);
}
}
private static DefaultPlexusContainer newPlexusContainer() throws PlexusContainerException {
final ClassWorld classWorld = new ClassWorld(MAVEN_CORE_REALM_ID, ClassWorld.class.getClassLoader());
final ClassRealm realm;
try {
realm = classWorld.getRealm(MAVEN_CORE_REALM_ID);
} catch(NoSuchRealmException e) {
throw new PlexusContainerException("Could not lookup required class realm", e);
}
final ContainerConfiguration mavenCoreCC = new DefaultContainerConfiguration() //
.setClassWorld(classWorld) //
.setRealm(realm) //
.setClassPathScanning(PlexusConstants.SCANNING_INDEX) //
.setAutoWiring(true) //
.setName("mavenCore"); //$NON-NLS-1$
final Module logginModule = new AbstractModule() {
protected void configure() {
bind(ILoggerFactory.class).toInstance(LoggerFactory.getILoggerFactory());
}
};
final Module coreExportsModule = new AbstractModule() {
protected void configure() {
ClassRealm realm = mavenCoreCC.getRealm();
CoreExtensionEntry entry = CoreExtensionEntry.discoverFrom(realm);
CoreExports exports = new CoreExports(entry);
bind(CoreExports.class).toInstance(exports);
}
};
return new DefaultPlexusContainer(mavenCoreCC, logginModule, new ExtensionModule(), coreExportsModule);
}
public synchronized void disposeContainer() {
if(plexus != null) {
plexus.dispose();
}
}
public ClassLoader getProjectRealm(MavenProject project) {
ClassLoader classLoader = project.getClassRealm();
if(classLoader == null) {
classLoader = plexus.getContainerRealm();
}
return classLoader;
}
public void interpolateModel(MavenProject project, Model model) throws CoreException {
ModelBuildingRequest request = new DefaultModelBuildingRequest();
request.setUserProperties(project.getProperties());
ModelProblemCollector problems = req -> {
};
lookup(ModelInterpolator.class).interpolateModel(model, project.getBasedir(), request, problems);
}
public <V> V execute(boolean offline, boolean forceDependencyUpdate, ICallable<V> callable, IProgressMonitor monitor)
throws CoreException {
IMavenExecutionContext context = createExecutionContext();
context.getExecutionRequest().setOffline(offline);
context.getExecutionRequest().setUpdateSnapshots(forceDependencyUpdate);
return context.execute(callable, monitor);
}
public <V> V execute(ICallable<V> callable, IProgressMonitor monitor) throws CoreException {
return context().execute(callable, monitor);
}
public void execute(final MavenProject project, final MojoExecution execution, final IProgressMonitor monitor)
throws CoreException {
context().execute(project, (context, pm) -> {
execute(context.getSession(), execution, pm);
return null;
}, monitor);
}
public MavenExecutionContext createExecutionContext() {
return new MavenExecutionContext(this);
}
public MavenExecutionContext getExecutionContext() {
return MavenExecutionContext.getThreadContext();
}
}