Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package org.apache.maven.api;

import java.nio.file.Path;
import java.util.Map;

import org.apache.maven.api.annotations.Experimental;
Expand All @@ -42,7 +43,7 @@ public interface Toolchain {
* @param toolName the tool platform independent tool name
* @return file representing the tool executable, or null if the tool cannot be found
*/
String findTool(String toolName);
Path findTool(String toolName);

/**
* Let the toolchain decide if it matches requirements defined
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@
@Experimental
public interface ToolchainManager extends Service {

/**
* The type identifying JDK toolchains
*/
String TYPE_JDK = "jdk";

/**
*
* @param session
Expand Down
6 changes: 4 additions & 2 deletions api/maven-api-toolchain/src/main/mdo/toolchains.mdo
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
<![CDATA[
public static final String USER_LEVEL = "user-level";
public static final String GLOBAL_LEVEL = "global-level";
public static final String DISCOVERED_LEVEL = "discovered-level";

private String sourceLevel = USER_LEVEL;
private boolean sourceLevelSet = false;
Expand All @@ -71,9 +72,10 @@
{
throw new IllegalStateException( "Cannot reset sourceLevel attribute; it is already set to: " + sourceLevel );
}
else if ( !( USER_LEVEL.equals( sourceLevel ) || GLOBAL_LEVEL.equals( sourceLevel ) ) )
else if ( !( USER_LEVEL.equals( sourceLevel ) || GLOBAL_LEVEL.equals( sourceLevel )
|| DISCOVERED_LEVEL.equals( sourceLevel ) ) )
{
throw new IllegalArgumentException( "sourceLevel must be one of: {" + USER_LEVEL + "," + GLOBAL_LEVEL + "}" );
throw new IllegalArgumentException( "sourceLevel must be one of: {" + USER_LEVEL + "," + GLOBAL_LEVEL + "," + DISCOVERED_LEVEL + "}" );
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,9 @@
import javax.inject.Singleton;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.repository.ArtifactRepository;
Expand Down Expand Up @@ -60,17 +58,8 @@ public DefaultMavenExecutionRequestPopulator(MavenRepositorySystem repositorySys
public MavenExecutionRequest populateFromToolchains(MavenExecutionRequest request, PersistedToolchains toolchains)
throws MavenExecutionRequestPopulationException {
if (toolchains != null) {
Map<String, List<ToolchainModel>> groupedToolchains = new HashMap<>(2);

for (ToolchainModel model : toolchains.getToolchains()) {
if (!groupedToolchains.containsKey(model.getType())) {
groupedToolchains.put(model.getType(), new ArrayList<>());
}

groupedToolchains.get(model.getType()).add(model);
}

request.setToolchains(groupedToolchains);
request.setToolchains(
toolchains.getToolchains().stream().collect(Collectors.groupingBy(ToolchainModel::getType)));
}
return request;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@
import javax.inject.Named;
import javax.inject.Singleton;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.apache.maven.api.JavaToolchain;
import org.apache.maven.api.Session;
import org.apache.maven.api.Toolchain;
import org.apache.maven.api.services.ToolchainManager;
Expand All @@ -35,6 +38,7 @@
import org.apache.maven.toolchain.DefaultToolchainManagerPrivate;
import org.apache.maven.toolchain.MisconfiguredToolchainException;
import org.apache.maven.toolchain.ToolchainPrivate;
import org.apache.maven.toolchain.java.JavaToolchainImpl;

@Named
@Singleton
Expand Down Expand Up @@ -70,7 +74,7 @@ public List<Toolchain> getToolchainsForType(Session session, String type) throws
ToolchainPrivate[] toolchains = toolchainManagerPrivate.getToolchainsForType(type, s);
return new MappedList<>(Arrays.asList(toolchains), this::toToolchain);
} catch (MisconfiguredToolchainException e) {
throw new ToolchainManagerException("Unable to get toochains for type " + type, e);
throw new ToolchainManagerException("Unable to get toolchains for type " + type, e);
}
}

Expand All @@ -83,11 +87,13 @@ public void storeToolchainToBuildContext(Session session, Toolchain toolchain) t
}

private Toolchain toToolchain(org.apache.maven.toolchain.Toolchain toolchain) {
return new ToolchainWrapper(toolchain);
return toolchain instanceof JavaToolchainImpl
? new JavaToolchainWrapper((JavaToolchainImpl) toolchain)
: new ToolchainWrapper(toolchain);
}

private static class ToolchainWrapper implements Toolchain {
private final org.apache.maven.toolchain.Toolchain toolchain;
protected final org.apache.maven.toolchain.Toolchain toolchain;

ToolchainWrapper(org.apache.maven.toolchain.Toolchain toolchain) {
this.toolchain = toolchain;
Expand All @@ -99,13 +105,24 @@ public String getType() {
}

@Override
public String findTool(String toolName) {
return toolchain.findTool(toolName);
public Path findTool(String toolName) {
return Paths.get(toolchain.findTool(toolName));
}

@Override
public boolean matchesRequirements(Map<String, String> requirements) {
return ((ToolchainPrivate) toolchain).matchesRequirements(requirements);
}
}

private static class JavaToolchainWrapper extends ToolchainWrapper implements JavaToolchain {
JavaToolchainWrapper(org.apache.maven.toolchain.java.JavaToolchainImpl toolchain) {
super(toolchain);
}

@Override
public String getJavaHome() {
return ((org.apache.maven.toolchain.java.JavaToolchainImpl) toolchain).getJavaHome();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,18 +83,20 @@ public final void addProvideToken(String type, RequirementMatcher matcher) {

@Override
public boolean matchesRequirements(Map<String, String> requirements) {
for (Map.Entry<String, String> requirement : requirements.entrySet()) {
String key = requirement.getKey();

RequirementMatcher matcher = provides.get(key);

if (matcher == null) {
getLog().debug("Toolchain " + this + " is missing required property: " + key);
return false;
}
if (!matcher.matches(requirement.getValue())) {
getLog().debug("Toolchain " + this + " doesn't match required property: " + key);
return false;
if (requirements != null) {
for (Map.Entry<String, String> requirement : requirements.entrySet()) {
String key = requirement.getKey();

RequirementMatcher matcher = provides.get(key);

if (matcher == null) {
getLog().debug("Toolchain " + this + " is missing required property: " + key);
return false;
}
if (!matcher.matches(requirement.getValue())) {
getLog().debug("Toolchain " + this + " doesn't match required property: " + key);
return false;
}
}
}
return true;
Expand Down
11 changes: 11 additions & 0 deletions maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
import org.apache.maven.shared.utils.logging.MessageUtils;
import org.apache.maven.toolchain.building.DefaultToolchainsBuildingRequest;
import org.apache.maven.toolchain.building.ToolchainsBuilder;
import org.apache.maven.toolchain.building.ToolchainsBuildingRequest;
import org.apache.maven.toolchain.building.ToolchainsBuildingResult;
import org.codehaus.plexus.ContainerConfiguration;
import org.codehaus.plexus.DefaultContainerConfiguration;
Expand Down Expand Up @@ -133,6 +134,8 @@ public class MavenCli {

public static final String MULTIMODULE_PROJECT_DIRECTORY = "maven.multiModuleProjectDirectory";

public static final String TOOLCHAINS_DISCOVERY_MODE = "maven.toolchainsDiscoveryMode";

public static final String USER_HOME = System.getProperty("user.home");

public static final File USER_MAVEN_CONFIGURATION_HOME = new File(USER_HOME, ".m2");
Expand Down Expand Up @@ -1198,6 +1201,14 @@ void toolchains(CliRequest cliRequest) throws Exception {
if (userToolchainsFile.isFile()) {
toolchainsRequest.setUserToolchainsSource(new FileSource(userToolchainsFile));
}
String discoveryModeStr = cliRequest.getUserProperties().getProperty(TOOLCHAINS_DISCOVERY_MODE);
if (discoveryModeStr == null) {
discoveryModeStr = cliRequest.getSystemProperties().getProperty(TOOLCHAINS_DISCOVERY_MODE);
}
if (discoveryModeStr == null) {
discoveryModeStr = ToolchainsBuildingRequest.DiscoveryMode.IfNoneConfigured.toString();
}
toolchainsRequest.setDiscoveryMode(ToolchainsBuildingRequest.DiscoveryMode.valueOf(discoveryModeStr));

eventSpyDispatcher.onEvent(toolchainsRequest);

Expand Down
9 changes: 9 additions & 0 deletions maven-toolchain-builder/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,20 @@ under the License.
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-interpolation</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import org.apache.maven.building.Problem;
import org.apache.maven.building.ProblemCollector;
import org.apache.maven.building.ProblemCollectorFactory;
import org.apache.maven.building.Source;
import org.apache.maven.toolchain.discovery.ToolchainDiscoverer;
import org.apache.maven.toolchain.io.ToolchainsParseException;
import org.apache.maven.toolchain.io.ToolchainsReader;
import org.apache.maven.toolchain.io.ToolchainsWriter;
Expand All @@ -54,23 +56,37 @@ public class DefaultToolchainsBuilder implements ToolchainsBuilder {
private final MavenToolchainMerger toolchainsMerger = new MavenToolchainMerger();
private final ToolchainsWriter toolchainsWriter;
private final ToolchainsReader toolchainsReader;
private final List<ToolchainDiscoverer> toolchainDiscoverers;

@Inject
public DefaultToolchainsBuilder(ToolchainsWriter toolchainsWriter, ToolchainsReader toolchainsReader) {
this.toolchainsWriter = toolchainsWriter;
this.toolchainsReader = toolchainsReader;
public DefaultToolchainsBuilder(
ToolchainsWriter toolchainsWriter,
ToolchainsReader toolchainsReader,
List<ToolchainDiscoverer> toolchainDiscoverers) {
this.toolchainsWriter = Objects.requireNonNull(toolchainsWriter);
this.toolchainsReader = Objects.requireNonNull(toolchainsReader);
this.toolchainDiscoverers = Objects.requireNonNull(toolchainDiscoverers);
}

@Override
public ToolchainsBuildingResult build(ToolchainsBuildingRequest request) throws ToolchainsBuildingException {
ProblemCollector problems = ProblemCollectorFactory.newInstance(null);

PersistedToolchains globalToolchains = readToolchains(request.getGlobalToolchainsSource(), request, problems);

PersistedToolchains userToolchains = readToolchains(request.getUserToolchainsSource(), request, problems);

PersistedToolchains globalToolchains = readToolchains(request.getGlobalToolchainsSource(), request, problems);
toolchainsMerger.merge(userToolchains, globalToolchains, TrackableBase.GLOBAL_LEVEL);

if (request.getDiscoveryMode() == ToolchainsBuildingRequest.DiscoveryMode.Always
|| request.getDiscoveryMode() == ToolchainsBuildingRequest.DiscoveryMode.IfNoneConfigured
&& userToolchains.getToolchains().isEmpty()) {

for (ToolchainDiscoverer discoverer : toolchainDiscoverers) {
PersistedToolchains toolchains = discoverer.discoverToolchains();
toolchainsMerger.merge(userToolchains, toolchains, TrackableBase.DISCOVERED_LEVEL);
}
}

problems.setSource("");

userToolchains = interpolate(userToolchains, problems);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public class DefaultToolchainsBuildingRequest implements ToolchainsBuildingReque

private Source userToolchainsSource;

private DiscoveryMode discoveryMode = DiscoveryMode.IfNoneConfigured;

@Override
public Source getGlobalToolchainsSource() {
return globalToolchainsSource;
Expand All @@ -52,4 +54,15 @@ public ToolchainsBuildingRequest setUserToolchainsSource(Source userToolchainsSo
this.userToolchainsSource = userToolchainsSource;
return this;
}

@Override
public DiscoveryMode getDiscoveryMode() {
return discoveryMode;
}

@Override
public ToolchainsBuildingRequest setDiscoveryMode(DiscoveryMode discoveryMode) {
this.discoveryMode = discoveryMode;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,16 @@
*/
public interface ToolchainsBuildingRequest {

/** Toolchains discovery mode */
enum DiscoveryMode {
/** Always add discovered toolchains */
Always,
/** Discover toolchains if none are configured */
IfNoneConfigured,
/** Never discover toolchains */
Never
}

/**
* Gets the global toolchains source.
*
Expand Down Expand Up @@ -59,4 +69,8 @@ public interface ToolchainsBuildingRequest {
* @return This request, never {@code null}.
*/
ToolchainsBuildingRequest setUserToolchainsSource(Source userToolchainsSource);

DiscoveryMode getDiscoveryMode();

ToolchainsBuildingRequest setDiscoveryMode(DiscoveryMode discoveryMode);
}
Loading