package org.testng.eclipse.util;
import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IAnnotation;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMemberValuePair;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.testng.eclipse.TestNGPlugin;
import org.testng.eclipse.launch.components.Filters;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
/**
* A class that represents all the information about groups in the current project
* (which types depend on which groups, which types define groups, which methods
* define on which groups and which methods define groups.
*/
public class DependencyInfo {
Multimap<String, IType> typesByGroups = ArrayListMultimap.create();
Multimap<IType, String> groupDependenciesByTypes = ArrayListMultimap.create();
Multimap<String, IMethod> methodsByGroups = ArrayListMultimap.create();
Multimap<IMethod, String> groupDependenciesByMethods = ArrayListMultimap.create();
Multimap<IMethod, IMethod> methodsByMethods = ArrayListMultimap.create();
public static DependencyInfo createDependencyInfo(final IJavaProject javaProject) {
final DependencyInfo result = new DependencyInfo();
final IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
final Set<IType> allTypes = new HashSet<>();
try {
monitor.beginTask("Launching", 2000);
monitor.subTask("Calculating dependencies");
TestSearchEngine.collectTypes(javaProject, monitor, allTypes, Filters.SINGLE_TEST,
"Parsing tests");
monitor.subTask("Collecting group information");
monitor.worked(1);
for (IType type : allTypes) {
for (IMethod method : type.getMethods()) {
for (IAnnotation annotation : method.getAnnotations()) {
monitor.worked(1);
IMemberValuePair[] pairs = annotation.getMemberValuePairs();
if ("Test".equals(annotation.getElementName()) && pairs.length > 0) {
for (IMemberValuePair pair : pairs) {
if ("groups".equals(pair.getMemberName())) {
Object groups = pair.getValue();
if (groups.getClass().isArray()) {
for (Object o : (Object[]) groups) {
result.typesByGroups.put(o.toString(), type);
result.methodsByGroups.put(o.toString(), method);
}
} else {
result.typesByGroups.put(groups.toString(), type);
result.methodsByGroups.put(groups.toString(), method);
}
} else if ("dependsOnGroups".equals(pair.getMemberName())) {
Object dependencies = pair.getValue();
if (dependencies.getClass().isArray()) {
for (Object o : (Object[]) dependencies) {
result.groupDependenciesByTypes.put(type, o.toString());
result.groupDependenciesByMethods.put(method, o.toString());
}
} else {
result.groupDependenciesByTypes.put(type, dependencies.toString());
result.groupDependenciesByMethods.put(method,dependencies.toString());
}
} else if ("dependsOnMethods".equals(pair.getMemberName())) {
Object dependencies = pair.getValue();
IType methodType = method.getDeclaringType();
if (dependencies.getClass().isArray()) {
for (Object o : (Object[]) dependencies) {
IMethod depMethod = JDTUtil.fuzzyFindMethodInProject(javaProject, methodType,
method, o.toString());
if (depMethod != null) {
result.methodsByMethods.put(method, depMethod);
}
}
} else {
IMethod depMethod = JDTUtil.fuzzyFindMethodInProject(javaProject, methodType,
method, dependencies.toString());
if (depMethod != null) {
result.methodsByMethods.put(method, depMethod);
}
}
}
}
}
}
}
}
} catch (CoreException e) {
TestNGPlugin.log(e);
}
}
};
Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
try {
dialog.run(true /* fork */, true /* cancelable */, runnable);
} catch (InvocationTargetException | InterruptedException e) {
e.printStackTrace();
}
return result;
}
}