package mandelbrot.ocamljava_maven_plugin.util;
import java.io.File;
import java.util.Set;
import org.apache.maven.plugin.AbstractMojo;
import org.codehaus.plexus.util.FileUtils;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
public class FilesByExtensionGatherer {
private final AbstractMojo project;
private final Set<String> extensions;
public FilesByExtensionGatherer(final AbstractMojo project, final String extension) {
this(project, ImmutableSet.of(extension));
}
public FilesByExtensionGatherer(final AbstractMojo project, final Set<String> extensions) {
this.project = Preconditions.checkNotNull(project);
this.extensions = Preconditions.checkNotNull(extensions);
}
public Multimap<String, String> gather(final File root) {
final ImmutableMultimap.Builder<String,String> files = ImmutableMultimap.builder();
if (root == null)
return files.build();
final Optional<String> rootExtension;
if ((rootExtension = extensionOf(root)).isPresent()) {
files.put(rootExtension.get(), root.getPath());
return files.build();
}
if (!root.isDirectory() || root.listFiles() == null)
return files.build();
for (final File file : root.listFiles()) {
if (file.isDirectory()) {
project.getLog().info("scanning directory: " + file);
files.putAll(gather(file));
} else {
final Optional<String> extension;
if ((extension = extensionOf(file)).isPresent()) {
project.getLog().info("adding file : " + file);
files.put(extension.get(), file.getPath());
}
}
}
return files.build();
}
private Optional<String> extensionOf(final File root) {
if (root == null || !root.isFile())
return Optional.absent();
final String extension = FileUtils.getExtension(root.getPath());
if (extensions.contains(extension))
return Optional.of(extension);
return Optional.absent();
}
}