package net.jangaroo.jooc.mvnplugin.util;
import net.jangaroo.jooc.mvnplugin.Types;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.compiler.util.scan.InclusionScanException;
import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner;
import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class MavenPluginHelper {
private MavenProject project;
private Log log;
public MavenPluginHelper(MavenProject project, Log log) {
this.project = project;
this.log = log;
}
public List<File> computeStaleSources(List<File> compileSourceRoots, Set<String> includes, Set<String> excludes, File outputDirectory, String inputFileSuffix, String outputFileSuffix, int staleMillis) throws MojoExecutionException {
SourceInclusionScanner scanner = createSourceInclusionScanner(includes, excludes, inputFileSuffix, staleMillis);
scanner.addSourceMapping(new SuffixMapping(inputFileSuffix, outputFileSuffix));
log.debug("Searching for");
Set<File> staleSources = new LinkedHashSet<File>();
for (File rootFile : compileSourceRoots) {
if (!rootFile.isDirectory()) {
continue;
}
try {
log.debug("scanner.getIncludedSources(" + rootFile + ", " + outputDirectory + ")");
//noinspection unchecked
staleSources.addAll(scanner.getIncludedSources(rootFile, outputDirectory));
}
catch (InclusionScanException e) {
throw new MojoExecutionException(
"Error scanning source root: \'" + rootFile.getAbsolutePath() + "\' " + "for stale files to recompile.", e);
}
}
return Collections.unmodifiableList(new ArrayList<File>(staleSources));
}
private SourceInclusionScanner createSourceInclusionScanner(Set<String> includes, Set<String> excludes, String inputFileSuffix, int staleMillis) {
SourceInclusionScanner scanner;
if (staleMillis >= 0 && includes.isEmpty() && excludes.isEmpty()) {
scanner = new StaleSourceScanner(staleMillis);
} else {
if (includes.isEmpty()) {
includes.add("**/*" + inputFileSuffix);
}
scanner = staleMillis >= 0 ? new StaleSourceScanner(staleMillis, includes, excludes)
: new SimpleSourceInclusionScanner(includes, excludes);
}
log.debug("Using source inclusion scanner " + scanner);
return scanner;
}
public List<File> getActionScriptClassPath(boolean includeTestScope) {
List<File> classPath = new ArrayList<File>();
Collection<Artifact> dependencies = getArtifacts();
for (Artifact dependency : dependencies) {
if (log.isDebugEnabled()) {
log.debug("Dependency: " + dependency.getGroupId() + ":" + dependency.getArtifactId() + " type: " + dependency.getType());
}
if (!dependency.isOptional() && ("compile".equals(dependency.getScope()) || includeTestScope && "test".equals(dependency.getScope())) && "jar".equals(dependency.getType())) {
if (log.isDebugEnabled()) {
log.debug("adding to classpath: compile dependency [" + dependency.toString() + "]");
}
classPath.add(dependency.getFile());
}
}
// only for backwards-compatibility, use "src/main/joo-api" directory if it exists:
File jooApiDir = new File(project.getBasedir(), "src/main/joo-api");
if (jooApiDir.exists()) {
classPath.add(0, jooApiDir);
}
return classPath;
}
@SuppressWarnings({"unchecked"})
public Set<Artifact> getArtifacts() {
return (Set<Artifact>) project.getArtifacts();
}
}