blob: dd26a5a4ab626d1f9f9e31c402f15baf2f0f9118 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2019 Sonatype Inc. and others.
* 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.tycho.core.resolver;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
import org.eclipse.tycho.ReactorProject;
import org.eclipse.tycho.artifacts.DependencyArtifacts;
import org.eclipse.tycho.artifacts.TargetPlatform;
import org.eclipse.tycho.core.ArtifactDependencyVisitor;
import org.eclipse.tycho.core.DependencyResolver;
import org.eclipse.tycho.core.DependencyResolverConfiguration;
import org.eclipse.tycho.core.TargetPlatformConfiguration;
import org.eclipse.tycho.core.TychoConstants;
import org.eclipse.tycho.core.TychoProject;
import org.eclipse.tycho.core.ee.ExecutionEnvironmentConfigurationImpl;
import org.eclipse.tycho.core.ee.shared.ExecutionEnvironmentConfiguration;
import org.eclipse.tycho.core.osgitools.AbstractTychoProject;
import org.eclipse.tycho.core.osgitools.DebugUtils;
import org.eclipse.tycho.core.osgitools.DefaultReactorProject;
import org.eclipse.tycho.core.resolver.shared.PlatformPropertiesUtils;
import org.eclipse.tycho.core.utils.TychoProjectUtils;
import org.eclipse.tycho.resolver.DependencyVisitor;
import org.eclipse.tycho.resolver.TychoResolver;
@Component(role = TychoResolver.class)
public class DefaultTychoResolver implements TychoResolver {
@Requirement
private Logger logger;
@Requirement
private DefaultTargetPlatformConfigurationReader configurationReader;
@Requirement
private DefaultDependencyResolverFactory dependencyResolverLocator;
@Requirement(role = TychoProject.class)
private Map<String, TychoProject> projectTypes;
public static final String TYCHO_ENV_OSGI_WS = "tycho.env.osgi.ws";
public static final String TYCHO_ENV_OSGI_OS = "tycho.env.osgi.os";
public static final String TYCHO_ENV_OSGI_ARCH = "tycho.env.osgi.arch";
@Override
public void setupProject(MavenSession session, MavenProject project, ReactorProject reactorProject) {
AbstractTychoProject dr = (AbstractTychoProject) projectTypes.get(project.getPackaging());
if (dr == null) {
return;
}
// skip if setup was already done
if (project.getContextValue(TychoConstants.CTX_MERGED_PROPERTIES) != null) {
return;
}
// generic Eclipse/OSGi metadata
dr.setupProject(session, project);
// p2 metadata
Properties properties = new Properties();
properties.putAll(project.getProperties());
properties.putAll(session.getSystemProperties()); // session wins
properties.putAll(session.getUserProperties());
project.setContextValue(TychoConstants.CTX_MERGED_PROPERTIES, properties);
setTychoEnvironmentProperties(properties, project);
TargetPlatformConfiguration configuration = configurationReader.getTargetPlatformConfiguration(session,
project);
project.setContextValue(TychoConstants.CTX_TARGET_PLATFORM_CONFIGURATION, configuration);
ExecutionEnvironmentConfiguration eeConfiguration = new ExecutionEnvironmentConfigurationImpl(logger,
!configuration.isResolveWithEEConstraints());
dr.readExecutionEnvironmentConfiguration(project, eeConfiguration);
project.setContextValue(TychoConstants.CTX_EXECUTION_ENVIRONMENT_CONFIGURATION, eeConfiguration);
DependencyResolver resolver = dependencyResolverLocator.lookupDependencyResolver(project);
resolver.setupProjects(session, project, reactorProject);
}
@Override
public void resolveProject(MavenSession session, MavenProject project, List<ReactorProject> reactorProjects) {
AbstractTychoProject dr = (AbstractTychoProject) projectTypes.get(project.getPackaging());
if (dr == null) {
return;
}
DependencyResolver resolver = dependencyResolverLocator.lookupDependencyResolver(project);
logger.info("Computing target platform for " + project);
TargetPlatform preliminaryTargetPlatform = resolver.computePreliminaryTargetPlatform(session, project,
reactorProjects);
TargetPlatformConfiguration configuration = TychoProjectUtils.getTargetPlatformConfiguration(project);
DependencyResolverConfiguration resolverConfiguration = configuration.getDependencyResolverConfiguration();
logger.info("Resolving dependencies of " + project);
// store EE configuration in case second resolution has to be applied due to Java version removing modules
ExecutionEnvironmentConfiguration oldEE = TychoProjectUtils.getExecutionEnvironmentConfiguration(project);
String javaVersion = System.getProperty("java.specification.version");
String newEEName = "JavaSE-" + javaVersion;
DependencyArtifacts dependencyArtifacts;
if (javaVersion.compareTo("11") >= 0 && !oldEE.getProfileName().equals(newEEName)) {
dependencyArtifacts = resolveWithCurrentEE(session, project, newEEName);
} else {
dependencyArtifacts = resolver.resolveDependencies(session, project, preliminaryTargetPlatform,
reactorProjects, resolverConfiguration);
}
if (logger.isDebugEnabled() && DebugUtils.isDebugEnabled(session, project)) {
StringBuilder sb = new StringBuilder();
sb.append("Resolved target platform for ").append(project).append("\n");
dependencyArtifacts.toDebugString(sb, " ");
logger.debug(sb.toString());
}
dr.setDependencyArtifacts(session, project, dependencyArtifacts);
logger.info("Resolving class path of " + project);
dr.resolveClassPath(session, project);
//reset EE to original one
project.setContextValue(TychoConstants.CTX_EXECUTION_ENVIRONMENT_CONFIGURATION, oldEE);
resolver.injectDependenciesIntoMavenModel(project, dr, dependencyArtifacts, logger);
if (logger.isDebugEnabled() && DebugUtils.isDebugEnabled(session, project)) {
StringBuilder sb = new StringBuilder();
sb.append("Injected dependencies for ").append(project.toString()).append("\n");
for (Dependency dependency : project.getDependencies()) {
sb.append(" ").append(dependency.toString());
}
logger.debug(sb.toString());
}
}
@Override
public void traverse(MavenProject project, final DependencyVisitor visitor) {
TychoProject tychoProject = projectTypes.get(project.getPackaging());
if (tychoProject != null) {
tychoProject.getDependencyWalker(project).walk(new ArtifactDependencyVisitor() {
@Override
public void visitPlugin(org.eclipse.tycho.core.PluginDescription plugin) {
visitor.visit(plugin);
}
@Override
public boolean visitFeature(org.eclipse.tycho.core.FeatureDescription feature) {
return visitor.visit(feature);
}
});
} else {
// TODO do something!
}
}
protected void setTychoEnvironmentProperties(Properties properties, MavenProject project) {
String arch = PlatformPropertiesUtils.getArch(properties);
String os = PlatformPropertiesUtils.getOS(properties);
String ws = PlatformPropertiesUtils.getWS(properties);
project.getProperties().put(TYCHO_ENV_OSGI_WS, ws);
project.getProperties().put(TYCHO_ENV_OSGI_OS, os);
project.getProperties().put(TYCHO_ENV_OSGI_ARCH, arch);
}
private DependencyArtifacts resolveWithCurrentEE(MavenSession session, MavenProject project, String newEEName) {
TargetPlatformConfiguration config = (TargetPlatformConfiguration) project
.getContextValue(TychoConstants.CTX_TARGET_PLATFORM_CONFIGURATION);
config.setExecutionEnvironment(newEEName);
ExecutionEnvironmentConfiguration sink = new ExecutionEnvironmentConfigurationImpl(logger,
!config.isResolveWithEEConstraints());
sink.overrideProfileConfiguration(newEEName, "current execution environment");
project.setContextValue(TychoConstants.CTX_EXECUTION_ENVIRONMENT_CONFIGURATION, sink);
List<ReactorProject> reactorProjects = DefaultReactorProject.adapt(session);
DependencyResolverConfiguration resolverConfiguration = config.getDependencyResolverConfiguration();
DependencyResolver depResolver = dependencyResolverLocator.lookupDependencyResolver(project);
TargetPlatform preliminaryTargetPlatform = depResolver.computePreliminaryTargetPlatform(session, project,
reactorProjects);
return depResolver.resolveDependencies(session, project, preliminaryTargetPlatform, reactorProjects,
resolverConfiguration);
}
}