blob: 833af653e0643d6b50e27ea2943decaf55890eac [file] [log] [blame]
/*
* 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.
*/
package org.netbeans.modules.maven.embedder;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.maven.DefaultMaven;
import org.apache.maven.Maven;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
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.lifecycle.mapping.Lifecycle;
import org.apache.maven.lifecycle.mapping.LifecycleMapping;
import org.apache.maven.model.Model;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.ModelBuilder;
import org.apache.maven.model.building.ModelBuildingException;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.model.building.ModelBuildingResult;
import org.apache.maven.plugin.LegacySupport;
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.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.building.DefaultSettingsBuildingRequest;
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.crypto.DefaultSettingsDecryptionRequest;
import org.apache.maven.settings.crypto.SettingsDecrypter;
import org.apache.maven.settings.crypto.SettingsDecryptionResult;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.netbeans.api.annotations.common.CheckForNull;
import org.netbeans.api.annotations.common.NonNull;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.modules.maven.embedder.exec.ProgressTransferListener;
import org.netbeans.modules.maven.embedder.impl.NBModelBuilder;
import org.netbeans.modules.maven.embedder.impl.NbRepositoryCache;
import org.netbeans.modules.maven.embedder.impl.NbWorkspaceReader;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
import org.openide.util.BaseUtilities;
import org.eclipse.aether.repository.Authentication;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
import org.eclipse.aether.util.repository.AuthenticationBuilder;
import org.eclipse.aether.util.repository.DefaultAuthenticationSelector;
import org.eclipse.aether.util.repository.DefaultMirrorSelector;
import org.eclipse.aether.util.repository.DefaultProxySelector;
/**
* Handle for the embedded Maven system, used to parse POMs and more.
* Since 2.36, all File instances in Artifacts, MavenProjects or Models should be pre-emptively normalized.
*/
public final class MavenEmbedder {
private static final Logger LOG = Logger.getLogger(MavenEmbedder.class.getName());
private final PlexusContainer plexus;
private final DefaultMaven maven;
private final ProjectBuilder projectBuilder;
private final RepositorySystem repositorySystem;
private final MavenExecutionRequestPopulator populator;
private final SettingsBuilder settingsBuilder;
private final EmbedderConfiguration embedderConfiguration;
private final SettingsDecrypter settingsDecrypter;
private long settingsTimestamp;
private static final Object lastLocalRepositoryLock = new Object();
private static URI lastLocalRepository;
private Settings settings;
MavenEmbedder(EmbedderConfiguration configuration) throws ComponentLookupException {
embedderConfiguration = configuration;
plexus = configuration.getContainer();
this.maven = (DefaultMaven) plexus.lookup(Maven.class);
this.projectBuilder = plexus.lookup(ProjectBuilder.class);
this.repositorySystem = plexus.lookup(RepositorySystem.class);
this.settingsBuilder = plexus.lookup(SettingsBuilder.class);
this.populator = plexus.lookup(MavenExecutionRequestPopulator.class);
settingsDecrypter = plexus.lookup(SettingsDecrypter.class);
}
public PlexusContainer getPlexus() {
return plexus;
}
/**
* contains System.getProperties() with some netbeans IDE JVM related items filtered out + environment variables prefixed with "env."
* @return
*/
public Properties getSystemProperties() {
return embedderConfiguration.getSystemProperties();
}
boolean isOffline() {
return embedderConfiguration.isOffline();
}
public ArtifactRepository getLocalRepository() {
try {
String localRepositoryPath = getSettings().getLocalRepository();
if (localRepositoryPath != null) {
return repositorySystem.createLocalRepository(FileUtil.normalizeFile(new File(localRepositoryPath)));
}
return repositorySystem.createDefaultLocalRepository();
} catch (InvalidRepositoryException ex) {
// can't happen
throw new IllegalStateException(ex);
}
}
/**
*
* @return normalized File for local repository root
* @since 2.26
*/
public File getLocalRepositoryFile() {
return FileUtil.normalizeFile(new File(getLocalRepository().getBasedir()));
}
//only for unit tests..
private static Settings testSettings;
@SuppressWarnings("NestedSynchronizedStatement")
@org.netbeans.api.annotations.common.SuppressWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
public synchronized Settings getSettings() {
if (Boolean.getBoolean("no.local.settings")) { // for unit tests
if (testSettings == null) {
testSettings = new Settings();
}
return testSettings; // could instead make public void setSettings(Settings settingsOverride)
}
File settingsXml = embedderConfiguration.getSettingsXml();
long newSettingsTimestamp = settingsXml.hashCode() ^ settingsXml.lastModified() ^ SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE.lastModified();
// could be included but currently constant: hashCode() of those files; getSystemProperties.hashCode()
if (settings != null && settingsTimestamp == newSettingsTimestamp) {
LOG.log(Level.FINER, "settings.xml cache hit for {0}", this);
return settings;
}
LOG.log(Level.FINE, "settings.xml cache miss for {0}", this);
SettingsBuildingRequest req = new DefaultSettingsBuildingRequest();
req.setGlobalSettingsFile(settingsXml);
req.setUserSettingsFile(SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE);
req.setSystemProperties(getSystemProperties());
req.setUserProperties(embedderConfiguration.getUserProperties());
try {
settings = settingsBuilder.build(req).getEffectiveSettings();
//now update the UNOWNED marker for FOQ at root of the local repository.
String localRep = settings.getLocalRepository();
if (localRep == null) {
localRep = RepositorySystem.defaultUserLocalRepository.getAbsolutePath();
}
URI localRepU = BaseUtilities.toURI(FileUtil.normalizeFile(new File(localRep)));
synchronized (lastLocalRepositoryLock) {
if (lastLocalRepository == null || !lastLocalRepository.equals(localRepU)) {
FileOwnerQuery.markExternalOwner(localRepU, FileOwnerQuery.UNOWNED, FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
if (lastLocalRepository != null) {
FileOwnerQuery.markExternalOwner(lastLocalRepository, null, FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
}
lastLocalRepository = localRepU;
}
}
settingsTimestamp = newSettingsTimestamp;
return settings;
} catch (SettingsBuildingException x) {
LOG.log(Level.FINE, null, x); // #192768: do not even bother logging to console by default, too noisy
return new Settings();
}
}
@Deprecated
public MavenExecutionResult readProjectWithDependencies(MavenExecutionRequest req) {
return readProjectWithDependencies(req, true);
}
public MavenExecutionResult readProjectWithDependencies(MavenExecutionRequest req, boolean useWorkspaceResolution) {
if (useWorkspaceResolution) {
req.setWorkspaceReader(new NbWorkspaceReader());
}
File pomFile = req.getPom();
MavenExecutionResult result = new DefaultMavenExecutionResult();
try {
ProjectBuildingRequest configuration = req.getProjectBuildingRequest();
configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
configuration.setResolveDependencies(true);
configuration.setRepositorySession(maven.newRepositorySession(req));
ProjectBuildingResult projectBuildingResult = projectBuilder.build(pomFile, configuration);
result.setProject(projectBuildingResult.getProject());
result.setDependencyResolutionResult(projectBuildingResult.getDependencyResolutionResult());
} catch (ProjectBuildingException ex) {
//don't add the exception here. this should come out as a build marker, not fill
//the error logs with msgs
return result.addException(ex);
}
normalizePaths(result.getProject());
return result;
}
public List<MavenExecutionResult> readProjectsWithDependencies(MavenExecutionRequest req, List<File> poms, boolean useWorkspaceResolution) {
if (useWorkspaceResolution) {
req.setWorkspaceReader(new NbWorkspaceReader());
}
// File pomFile = req.getPom();
Map<File, MavenExecutionResult> results = new HashMap<>(poms.size());
List<ProjectBuildingResult> projectBuildingResults = new LinkedList<>();
ProjectBuildingRequest configuration = req.getProjectBuildingRequest();
configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
configuration.setResolveDependencies(true);
configuration.setRepositorySession(maven.newRepositorySession(req));
try {
projectBuildingResults = projectBuilder.build(poms, true, configuration);
} catch (ProjectBuildingException ex) {
//don't add the exception here. this should come out as a build marker, not fill
//the error logs with msgs
List<ProjectBuildingResult> pbrs = ex.getResults();
if(pbrs != null) {
for (ProjectBuildingResult pbr : pbrs) {
if(!pbr.getProblems().isEmpty()) {
// exception holds info about all problematic projects
DefaultMavenExecutionResult r = new DefaultMavenExecutionResult();
results.put(pbr.getPomFile(), r.addException(ex));
} else {
setResult(pbr, results);
}
}
} else {
for (File f : poms) {
DefaultMavenExecutionResult r = new DefaultMavenExecutionResult();
results.put(f, r.addException(ex));
}
}
}
// for (File pom : poms) {
// try {
// ProjectBuildingResult rs = projectBuilder.build(pom, configuration);
// if(rs != null) {
// projectBuildingResults.add(rs);
// }
// } catch (ProjectBuildingException ex) {
// //don't add the exception here. this should come out as a build marker, not fill
// //the error logs with msgs
// List<ProjectBuildingResult> pbrs = ex.getResults();
// if(pbrs != null) {
// assert pbrs.size() == 1;
// for (ProjectBuildingResult pbr : pbrs) {
// if(!pbr.getProblems().isEmpty()) {
// // exception holds info about all problematic projects
// DefaultMavenExecutionResult r = new DefaultMavenExecutionResult();
// results.put(pbr.getPomFile(), r.addException(ex));
// } else {
// setResult(pbr, results, null);
// }
// }
// } else {
//// for (File f : poms) {
// DefaultMavenExecutionResult r = new DefaultMavenExecutionResult();
// results.put(pom, r.addException(ex));
//// }
// }
// }
// }
for (ProjectBuildingResult pbr : projectBuildingResults) {
MavenExecutionResult r = results.get(pbr.getPomFile());
if( r == null ) {
setResult(pbr, results);
}
}
return new ArrayList<>(results.values());
}
public Artifact createArtifactWithClassifier(@NonNull String groupId, @NonNull String artifactId, @NonNull String version, String type, String classifier) {
return repositorySystem.createArtifactWithClassifier(groupId, artifactId, version, type, classifier);
}
public Artifact createArtifact(@NonNull String groupId, @NonNull String artifactId, @NonNull String version, @NonNull String packaging) {
return repositorySystem.createArtifact(groupId, artifactId, version, packaging);
}
public Artifact createArtifact(@NonNull String groupId, @NonNull String artifactId, @NonNull String version, String scope, String type) {
return repositorySystem.createArtifact( groupId, artifactId, version, scope, type);
}
public Artifact createProjectArtifact(@NonNull String groupId, @NonNull String artifactId, @NonNull String version) {
return repositorySystem.createProjectArtifact(groupId, artifactId, version);
}
/**
* using this method one creates an ArtifactRepository instance with injected mirrors and proxies
* @param url
* @param id
* @return
*/
public ArtifactRepository createRemoteRepository(String url, String id) {
setUpLegacySupport();
ArtifactRepositoryFactory fact = lookupComponent(ArtifactRepositoryFactory.class);
assert fact!=null : "ArtifactRepositoryFactory component not found in maven";
ArtifactRepositoryPolicy snapshotsPolicy = new ArtifactRepositoryPolicy(true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS, ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN);
ArtifactRepositoryPolicy releasesPolicy = new ArtifactRepositoryPolicy(true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS, ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN);
return fact.createArtifactRepository(id, url, new DefaultRepositoryLayout(), snapshotsPolicy, releasesPolicy);
}
/**
*
* @param sources
* @param remoteRepositories - these instances need to be properly mirrored and proxied. Either by creating via EmbedderFactory.createRemoteRepository()
* or by using instances from MavenProject
* @param localRepository
* @throws ArtifactResolutionException
* @throws ArtifactNotFoundException
*/
public void resolve(Artifact sources, List<ArtifactRepository> remoteRepositories, ArtifactRepository localRepository) throws ArtifactResolutionException, ArtifactNotFoundException {
setUpLegacySupport();
ArtifactResolutionRequest req = new ArtifactResolutionRequest();
req.setLocalRepository(localRepository);
req.setRemoteRepositories(remoteRepositories);
req.setArtifact(sources);
req.setOffline(isOffline());
ArtifactResolutionResult result = repositorySystem.resolve(req);
normalizePath(sources);
// XXX check result for exceptions and throw them now?
for (Exception ex : result.getExceptions()) {
LOG.log(Level.FINE, null, ex);
}
}
//TODO possibly rename.. build sounds like something else..
public ProjectBuildingResult buildProject(Artifact art, ProjectBuildingRequest req) throws ProjectBuildingException {
if (req.getLocalRepository() == null) {
req.setLocalRepository(getLocalRepository());
}
MavenExecutionRequest request = createMavenExecutionRequest();
req.setProcessPlugins(false);
req.setRepositorySession(maven.newRepositorySession(request));
ProjectBuildingResult res = projectBuilder.build(art, req);
normalizePaths(res.getProject());
return res;
}
public MavenExecutionResult execute(MavenExecutionRequest req) {
return maven.execute(req);
}
/**
* Creates a list of POM models in an inheritance lineage.
* Each resulting model is "raw", so contains no interpolation or inheritance.
* In particular beware that groupId and/or version may be null if inherited from a parent; use {@link Model#getParent} to resolve.
* Internally calls <code>executeModelBuilder</code> so if you need to call both just use the execute method.
* @param pom a POM to inspect
* @param embedder an embedder to use
* @return a list of models, starting with the specified POM, going through any parents, finishing with the Maven superpom (with a null artifactId)
* @throws ModelBuildingException if the POM or parents could not even be parsed; warnings are not reported
*/
public List<Model> createModelLineage(File pom) throws ModelBuildingException {
ModelBuildingResult res = executeModelBuilder(pom);
List<Model> toRet = new ArrayList<Model>();
for (String id : res.getModelIds()) {
Model m = res.getRawModel(id);
normalizePath(m);
toRet.add(m);
}
// for (ModelProblem p : res.getProblems()) {
// System.out.println("problem=" + p);
// if (p.getException() != null) {
// p.getException().printStackTrace();
// }
// }
return toRet;
}
/**
*
* @param pom
* @return result object with access to effective pom model and raw models for each parent.
* @throws ModelBuildingException if the POM or parents could not even be parsed; warnings are not reported
*/
public ModelBuildingResult executeModelBuilder(File pom) throws ModelBuildingException {
ModelBuilder mb = lookupComponent(ModelBuilder.class);
assert mb!=null : "ModelBuilder component not found in maven";
ModelBuildingRequest req = new DefaultModelBuildingRequest();
req.setPomFile(pom);
req.setProcessPlugins(false);
req.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
req.setLocationTracking(true);
req.setModelResolver(new NBRepositoryModelResolver(this));
req.setSystemProperties(getSystemProperties());
req.setUserProperties(embedderConfiguration.getUserProperties());
return mb.build(req);
}
public List<String> getLifecyclePhases() {
LifecycleMapping lifecycleMapping = lookupComponent(LifecycleMapping.class);
if (lifecycleMapping != null) {
Set<String> phases = new TreeSet<String>();
Map<String, Lifecycle> lifecycles = lifecycleMapping.getLifecycles();
for (Lifecycle lifecycle : lifecycles.values()) {
phases.addAll(lifecycle.getPhases().keySet());
}
return new ArrayList<String>(phases);
}
return Collections.<String>emptyList();
}
public <T> T lookupComponent(Class<T> clazz) {
try {
return plexus.lookup(clazz);
} catch (ComponentLookupException ex) {
LOG.warning(ex.getMessage());
}
return null;
}
/**
* a prepopulate maven execution request object, most notably but systemProperties and userProperties
* fields are prepopulated with default values, typically one should only add to these values, not replace them.
* @return
*/
public MavenExecutionRequest createMavenExecutionRequest(){
MavenExecutionRequest req = new DefaultMavenExecutionRequest();
ArtifactRepository localRepository = getLocalRepository();
req.setLocalRepository(localRepository);
req.setLocalRepositoryPath(localRepository.getBasedir());
//TODO: do we need to validate settings files?
File settingsXml = embedderConfiguration.getSettingsXml();
if (settingsXml !=null && settingsXml.exists()) {
req.setGlobalSettingsFile(settingsXml);
}
if (SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE != null && SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE.exists()) {
req.setUserSettingsFile(SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE);
}
req.setSystemProperties(getSystemProperties());
req.setUserProperties(embedderConfiguration.getUserProperties());
try {
//#212214 populating from settings needs to come first
//it adds mirrors and proxies to the request
//later on populateDefaults() will use these to replace/configure the default "central" repository
// and the repository id used is important down the road for resolution in EnhancedLocalRepositoryManager
populator.populateFromSettings(req, getSettings());
populator.populateDefaults(req);
} catch (MavenExecutionRequestPopulationException x) {
// XXX where to display this?
Exceptions.printStackTrace(x);
}
req.setOffline(isOffline());
req.setRepositoryCache(new NbRepositoryCache());
return req;
}
/**
* Needed to avoid an NPE in {@link org.eclipse.org.eclipse.aether.DefaultArtifactResolver#resolveArtifacts} under some conditions.
* (Also {@link org.eclipse.org.eclipse.aether.DefaultMetadataResolver#resolve}; wherever a {@link org.eclipse.aether.RepositorySystemSession} is used.)
* Should be called in the same thread as whatever thread was throwing the NPE.
*/
public void setUpLegacySupport() {
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
session.setOffline(isOffline());
SimpleLocalRepositoryManagerFactory f = new SimpleLocalRepositoryManagerFactory();
try {
session.setLocalRepositoryManager(f.newInstance(session, new LocalRepository(getLocalRepository().getBasedir())));
} catch (NoLocalRepositoryManagerException ex) {
LOG.log(Level.WARNING, null, ex);
}
// Adapted from DefaultMaven.newRepositorySession, but does not look like that can be called directly:
DefaultMirrorSelector mirrorSelector = new DefaultMirrorSelector();
Settings _settings = getSettings();
for (Mirror m : _settings.getMirrors()) {
mirrorSelector.add(m.getId(), m.getUrl(), m.getLayout(), false, m.getMirrorOf(), m.getMirrorOfLayouts());
}
session.setMirrorSelector(mirrorSelector);
SettingsDecryptionResult decryptionResult = settingsDecrypter.decrypt(new DefaultSettingsDecryptionRequest(_settings));
DefaultProxySelector proxySelector = new DefaultProxySelector();
for (Proxy p : decryptionResult.getProxies()) {
if (p.isActive()) {
AuthenticationBuilder ab = new AuthenticationBuilder();
ab.addUsername(p.getUsername());
ab.addPassword(p.getPassword());
Authentication a = ab.build();
//#null -> getProtocol() #209499
proxySelector.add(new org.eclipse.aether.repository.Proxy(p.getProtocol(), p.getHost(), p.getPort(), a), p.getNonProxyHosts());
}
}
session.setProxySelector(proxySelector);
DefaultAuthenticationSelector authenticationSelector = new DefaultAuthenticationSelector();
for (Server s : decryptionResult.getServers()) {
AuthenticationBuilder ab = new AuthenticationBuilder();
ab.addUsername(s.getUsername());
ab.addPassword(s.getPassword());
ab.addPrivateKey(s.getPrivateKey(), s.getPassphrase());
Authentication a = ab.build();
authenticationSelector.add(s.getId(), a);
}
session.setAuthenticationSelector(authenticationSelector);
DefaultMavenExecutionRequest mavenExecutionRequest = new DefaultMavenExecutionRequest();
mavenExecutionRequest.setOffline(isOffline());
mavenExecutionRequest.setTransferListener(ProgressTransferListener.activeListener());
session.setTransferListener(ProgressTransferListener.activeListener());
lookupComponent(LegacySupport.class).setSession(new MavenSession(getPlexus(), session, mavenExecutionRequest, new DefaultMavenExecutionResult()));
}
/**
* during creation of the MAvenProject instance, the list of all profiles available in
* the pom inheritance chain.
* @param mp
* @return list of available profiles or null if something went wrong..
* @since 2.29
*/
public static Set<String> getAllProjectProfiles(MavenProject mp) {
return NBModelBuilder.getAllProfiles(mp.getModel());
}
/**
* descriptions of models that went into effective pom, containing information that was lost in processing and is not cheap to obtain.
* in the list the current project's model description comes first, second is it's parent and so on.
* @param mp
* @return null if the parameter passed was not created using the Project Maven Embedder.
* @since 2.30
*/
public static @CheckForNull List<ModelDescription> getModelDescriptors(MavenProject mp) {
return NBModelBuilder.getModelDescriptors(mp.getModel());
}
/**
* normalize all File references in the object tree.
* @param project
* @since 2.36
*/
public static void normalizePaths(MavenProject project) {
if (project == null) {
return;
}
File f = project.getFile();
if (f != null) {
project.setFile(FileUtil.normalizeFile(f));
}
normalizePath(project.getArtifact());
normalizePaths(project.getAttachedArtifacts());
f = project.getParentFile();
if (f != null) {
project.setParentFile(FileUtil.normalizeFile(f));
}
normalizePath(project.getParentArtifact());
normalizePaths(project.getArtifacts());
normalizePaths(project.getDependencyArtifacts());
normalizePaths(project.getExtensionArtifacts());
normalizePaths(project.getPluginArtifacts());
normalizePath(project.getModel());
normalizePath(project.getOriginalModel());
}
static void normalizePath(Model model) {
if (model != null) {
File f = model.getPomFile();
if (f != null) {
model.setPomFile(FileUtil.normalizeFile(f));
}
}
}
static void normalizePaths(Collection<Artifact> arts) {
if (arts != null) {
for (Artifact aa : arts) {
normalizePath(aa);
}
}
}
static void normalizePath(Artifact a) {
if (a != null) {
File f = a.getFile();
if (f != null) {
a.setFile(FileUtil.normalizeFile(f));
}
}
}
private void setResult(ProjectBuildingResult pbr, Map<File, MavenExecutionResult> results) {
DefaultMavenExecutionResult r = new DefaultMavenExecutionResult();
normalizePaths(pbr.getProject());
r.setProject(pbr.getProject());
r.setDependencyResolutionResult(pbr.getDependencyResolutionResult());
results.put(pbr.getPomFile(), r);
}
/**
* descriptor containing some base information about the models collected while building
* effective model.
* @since 2.30
*/
public static interface ModelDescription {
/*
* groupId:artifactId:version
*/
String getId();
/**
* artifactId as defined in the model
* @return
*/
String getArtifactId();
/**
* version as defined in the model
* @return
*/
String getVersion();
/**
* groupId as defined in the model
* @return
*/
String getGroupId();
/**
* name as defined in the model
* @return
*/
String getName();
/**
* location of the model pom file.
* @return normalized path
*/
File getLocation();
/**
* all profile ids as found in the model
* @return
*/
List<String> getProfiles();
/**
* get all module declarations from base and from profile locations
* @return
*/
List<String> getModules();
}
}