/*
* Copyright 2014 Bernd Vogt and others.
*
* Licensed 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.sourcepit.b2.maven;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import javax.inject.Inject;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Repository;
import org.apache.maven.model.RepositoryPolicy;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.project.ProjectSorter;
import org.apache.maven.repository.RepositorySystem;
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.sourcepit.b2.maven.internal.wrapper.DescriptorUtils;
import org.sourcepit.b2.maven.internal.wrapper.DescriptorUtils.AbstractDescriptorResolutionStrategy;
import org.sourcepit.b2.maven.internal.wrapper.DescriptorUtils.IDescriptorResolutionStrategy;
import org.sourcepit.b2.test.resources.internal.harness.AbstractPlexusWorkspaceTest;
public abstract class AbstractMavenSessionWorkspaceTest extends AbstractPlexusWorkspaceTest {
@Inject
protected ProjectBuilder projectBuilder;
@Inject
protected RepositorySystem repositorySystem;
@Inject
protected SimpleLocalRepositoryManagerFactory localRepositoryManagerFactory;
protected File moduleDir;
protected MavenSession mavenSession;
protected void setUp() throws Exception {
super.setUp();
repositorySystem = lookup(RepositorySystem.class);
projectBuilder = lookup(ProjectBuilder.class);
moduleDir = setUpModuleDir();
mavenSession = createMavenSession(moduleDir, System.getProperties());
}
protected File setUpModuleDir() {
return workspace.importResources(setUpModulePath());
}
protected abstract String setUpModulePath();
@Override
protected void tearDown() throws Exception {
projectBuilder = null;
super.tearDown();
}
protected MavenSession createMavenSession(File moduleDir, Properties executionProperties) throws Exception {
final List<File> descriptors = new ArrayList<File>();
final List<File> skippedDescriptors = new ArrayList<File>();
collectModuleDescriptors(moduleDir, descriptors, skippedDescriptors);
final File pom = findMainDescriptor(moduleDir, descriptors);
MavenExecutionRequest request = createMavenExecutionRequest(pom);
ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest().setLocalRepository(
request.getLocalRepository())
.setRemoteRepositories(request.getRemoteRepositories())
.setPluginArtifactRepositories(request.getPluginArtifactRepositories())
.setSystemProperties(executionProperties);
final List<MavenProject> projects = new ArrayList<MavenProject>();
for (File descriptor : descriptors) {
projects.add(projectBuilder.build(descriptor, configuration).getProject());
}
initRepoSession(configuration);
MavenSession session = new MavenSession(getContainer(), configuration.getRepositorySession(), request,
new DefaultMavenExecutionResult());
session.setProjects(new ProjectSorter(projects).getSortedProjects());
return session;
}
protected File findMainDescriptor(File moduleDir, final List<File> descriptors) {
for (File file : descriptors) {
if (moduleDir.equals(file.getParentFile())) {
return file;
}
}
return null;
}
protected MavenExecutionRequest createMavenExecutionRequest(File pom) throws Exception {
MavenExecutionRequest request = new DefaultMavenExecutionRequest().setPom(pom)
.setProjectPresent(true)
.setShowErrors(true)
.setPluginGroups(Arrays.asList(new String[] { "org.apache.maven.plugins" }))
.setLocalRepository(getLocalRepository())
.setRemoteRepositories(getRemoteRepositories())
.setPluginArtifactRepositories(getPluginArtifactRepositories())
.setGoals(Arrays.asList(new String[] { "package" }));
return request;
}
protected void initRepoSession(ProjectBuildingRequest request) {
File localRepo = new File(request.getLocalRepository().getBasedir());
LocalRepository localRepository = new LocalRepository(localRepo);
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
try {
session.setLocalRepositoryManager(localRepositoryManagerFactory.newInstance(session, localRepository));
}
catch (NoLocalRepositoryManagerException e) {
throw new IllegalStateException(e);
}
request.setRepositorySession(session);
}
protected List<ArtifactRepository> getRemoteRepositories() throws InvalidRepositoryException {
File repoDir = new File(getBasedir(), "src/test/remote-repo").getAbsoluteFile();
RepositoryPolicy policy = new RepositoryPolicy();
policy.setEnabled(true);
policy.setChecksumPolicy("ignore");
policy.setUpdatePolicy("always");
Repository repository = new Repository();
repository.setId(RepositorySystem.DEFAULT_REMOTE_REPO_ID);
repository.setUrl("file://" + repoDir.toURI().getPath());
repository.setReleases(policy);
repository.setSnapshots(policy);
return Arrays.asList(repositorySystem.buildArtifactRepository(repository));
}
protected List<ArtifactRepository> getPluginArtifactRepositories() throws InvalidRepositoryException {
return getRemoteRepositories();
}
protected ArtifactRepository getLocalRepository() throws InvalidRepositoryException {
File repoDir = new File(getBasedir(), "target/local-repo").getAbsoluteFile();
return repositorySystem.createLocalRepository(repoDir);
}
protected void collectModuleDescriptors(File moduleDir, List<File> descriptors, List<File> skippedDescriptors) {
final IDescriptorResolutionStrategy resolver = new AbstractDescriptorResolutionStrategy(moduleDir, null) {
public File getDescriptor(File directory) {
final File descriptor = new File(directory, "module.xml");
if (descriptor.exists() && descriptor.isFile()) {
return descriptor;
}
return null;
}
};
DescriptorUtils.findModuleDescriptors(moduleDir, descriptors, skippedDescriptors, resolver);
}
}