package org.testng.eclipse.launch.components;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.testng.eclipse.ui.util.TypeParser;
public class Filters {
private Filters() {
}
public static final ViewerFilter TEST_FILTER = new TestViewerFilter();
public static final ViewerFilter SOURCE_DIRECTORY_FILTER = new SourceDirectoryFilter();
public static final ViewerFilter createProjectContentFilter(IJavaProject ijp) {
IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
List<IProject> rejectedElements = new ArrayList<>(allProjects.length);
IProject iproject = ijp.getProject();
for (int i= 0; i < allProjects.length; i++) {
if (!allProjects[i].equals(iproject)) {
rejectedElements.add(allProjects[i]);
}
}
return new ProjectContentFilter(rejectedElements);
}
private static class ProjectContentFilter extends ViewerFilter {
private List<IProject> m_rejectedEntries;
private ProjectContentFilter(final List<IProject> rejectedEntries) {
m_rejectedEntries = rejectedEntries;
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if(null == m_rejectedEntries || m_rejectedEntries.size() == 0) {
return true;
}
for (IProject prj : m_rejectedEntries) {
if(element.equals(prj)) {
return false;
}
}
return true;
}
}
private static class TestViewerFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if(element instanceof IProject) {
return true;
} else if(element instanceof IFolder) {
return hasTests((IContainer) element);
} else if(element instanceof IFile) {
if(isTest((IFile) element)) {
return true;
}
}
return false;
}
}
private static class SourceDirectoryFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if(element instanceof IProject) {
return true;
} else if(element instanceof IFolder) {
return hasSources((IContainer) element);
}
return false;
}
}
private static boolean hasTests(final IContainer folder) {
try {
IResource[] children = folder.members();
for(IResource res : children) {
if(res instanceof IFile) {
if(isTest((IFile) res)) {
return true;
}
else if (res instanceof IFolder) {
if(hasTests((IContainer) res)) {
return true;
}
}
}
}
}
catch(CoreException ce) {
}
return false;
}
private static boolean isTest(final IFile file) {
return "class".equals(file.getFileExtension())
|| isSource(file)
|| "xml".equals(file.getFileExtension());
}
private static boolean isSource(final IFile file) {
return "java".equals(file.getFileExtension());
}
private static boolean hasSources(final IContainer folder) {
try {
IResource[] children = folder.members();
for(IResource res : children) {
if(res instanceof IFile) {
if(isSource((IFile) res)) {
return true;
}
}
else if (res instanceof IFolder) {
if(hasSources((IContainer) res)) {
return true;
}
}
}
}
catch(CoreException ce) {
}
return false;
}
/**
* An interface to filter what types contain a certain test
* @author cbeust
*/
public static interface ITypeFilter {
public boolean accept(IType name);
}
public static Filters.ITypeFilter SINGLE_TEST = new Filters.ITypeFilter() {
public boolean accept(IType type) {
boolean result = TypeParser.parseType(type).isTestNGClass();
return result;
}
};
public static class GroupFilter implements ITypeFilter {
private String[] m_groupNames;
public GroupFilter(String... groupNames) {
m_groupNames = groupNames;
}
public boolean accept(IType type) {
ITestContent parsedType = TypeParser.parseType(type);
if (! parsedType.isTestNGClass()) {
return false;
} else {
for (String group : m_groupNames) {
if (parsedType.getGroups().contains(group)) {
return true;
}
}
return false;
}
}
}
public static Filters.ITypeFilter SUITE = new Filters.ITypeFilter() {
public boolean accept(IType type) {
boolean result = false;
// try {
ppp("CHECKING TESTNG.XML FOR " + type);
// result = hasTestMethod(type);
// }
// catch (JavaModelException e) {
// // ignore
// }
return result;
}
};
public static void ppp(String s) {
System.out.println("[Filters] " + s);
}
}
/////