package net.sourceforge.pmd.eclipse.runtime.cmd;
import java.io.File;
import java.util.List;
import net.sourceforge.pmd.cpd.Language;
import net.sourceforge.pmd.eclipse.runtime.properties.PropertiesException;
import net.sourceforge.pmd.util.StringUtil;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.ResourceWorkingSetFilter;
/**
* A visitor to process IFile resource against CPD
*
* @author David Craine
* @author Philippe Herlin
*
*/
public class CPDVisitor implements IResourceVisitor {
private static final Logger log = Logger.getLogger(CPDVisitor.class);
private boolean includeDerivedFiles;
private ResourceWorkingSetFilter workingSetFilter;
private Language language;
private List<File> files;
/**
* @param includeDerivedFiles The includeDerivedFiles to set.
*/
public void setIncludeDerivedFiles(boolean includeDerivedFiles) {
this.includeDerivedFiles = includeDerivedFiles;
}
/**
* @param workingSet WorkingSet of the visited project.
*/
public void setWorkingSet(IWorkingSet workingSet) {
this.workingSetFilter = new ResourceWorkingSetFilter();
this.workingSetFilter.setWorkingSet(workingSet);
}
/**
* @param language Only add files with that language
*/
public void setLanguage(Language language) {
this.language = language;
}
/**
* @return the list of files
*/
public List<File> getFiles() {
return this.files;
}
/**
* @param files the list of files to set
*/
public void setFiles(List<File> files) {
this.files = files;
}
/**
* @see org.eclipse.core.resources.IResourceVisitor#visit(IResource) Add java files into the CPD object
*/
public boolean visit(IResource resource) throws CoreException {
log.debug("CPD Visiting " + resource.getName());
if (resource instanceof IFile) {
IFile file = (IFile) resource;
File ioFile = file.getLocation().toFile();
try {
if (StringUtil.isNotEmpty(file.getFileExtension())
&& language.getFileFilter().accept(ioFile, file.getName())
&& isFileInWorkingSet(file)
&& (includeDerivedFiles || !file.isDerived())) {
log.debug("Add file " + resource.getName());
files.add(ioFile);
return false;
}
} catch (PropertiesException e) {
log.warn("ModelException when adding file " + resource.getName() + " to CPD. Continuing.", e);
}
}
return true;
}
/**
* Test if a file is in the PMD working set
*
* @param file
* @return true if the file should be checked
*/
private boolean isFileInWorkingSet(IFile file) throws PropertiesException {
boolean fileInWorkingSet = true;
if (workingSetFilter != null) {
fileInWorkingSet = workingSetFilter.select(null, null, file);
}
return fileInWorkingSet;
}
}