package xapi.mvn.impl;
import com.google.common.collect.ImmutableList;
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 xapi.log.X_Log;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author James X. Nelson (james@wetheinter.net)
* Created on 24/11/15.
*/
public class ProjectIterable implements Iterable<MavenProject> {
private final MavenProject root;
private final List<MavenProject> projects;
public ProjectIterable(
MavenProject project,
ProjectBuilder builder,
ProjectBuildingRequest request,
boolean includeSelf
) {
root = project;
final ArrayList<MavenProject> transientList = new ArrayList<>();
if (includeSelf) {
transientList.add(project);
}
addAllProjects(transientList, project, builder, request);
projects = ImmutableList.copyOf(transientList);
}
private void addAllProjects(
final List<MavenProject> projects,
final MavenProject project,
final ProjectBuilder builder,
final ProjectBuildingRequest request
) {
final List<String> modules = root.getModules();
File file = project.getFile().getParentFile();
for (String module : modules) {
final File moduleFile = new File(
new File(file, module),
"pom.xml"
);
try {
final ProjectBuildingResult result = builder.build(
moduleFile,
request
);
if (!result.getProblems().isEmpty()) {
X_Log.warn(getClass(), "Problems encountered looking up module ", moduleFile, result.getProblems());
}
projects.add(result.getProject());
if (!result.getProject().getModules().isEmpty()) {
addAllProjects(projects, result.getProject(), builder, request);
}
} catch (ProjectBuildingException e) {
X_Log.warn(getClass(), "Unable to build module for ", moduleFile);
}
}
}
@Override
public Iterator<MavenProject> iterator() {
return projects.iterator(); // This list is immutable, so Iterator.remove() will not work.
}
}