package com.redhat.ceylon.test.eclipse.plugin.launch;
import static com.redhat.ceylon.eclipse.core.builder.CeylonBuilder.getProjectDeclaredSourceModules;
import static com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil.containsCeylonTestImport;
import static com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil.getModule;
import static com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil.getPackage;
import static com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil.getProject;
import static com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil.getShell;
import static org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.IStatusHandler;
import org.eclipse.jface.dialogs.MessageDialog;
import com.redhat.ceylon.model.typechecker.model.Module;
import com.redhat.ceylon.model.typechecker.model.Package;
import com.redhat.ceylon.test.eclipse.plugin.CeylonTestMessages;
import com.redhat.ceylon.test.eclipse.plugin.CeylonTestPlugin;
import com.redhat.ceylon.test.eclipse.plugin.util.AddCeylonTestImport;
public class CeylonTestDependencyStatusHandler implements IStatusHandler {
public static final IStatus CODE = new Status(IStatus.ERROR, CeylonTestPlugin.PLUGIN_ID, 1001, "", null);
@Override
public Object handleStatus(IStatus status, Object source) throws CoreException {
return validateCeylonTestDependency((ILaunchConfiguration) source);
}
private boolean validateCeylonTestDependency(ILaunchConfiguration config) throws CoreException {
IProject project = getProject(config.getAttribute(ATTR_PROJECT_NAME, (String) null));
Set<Module> modules = getTestedModules(config);
Set<Module> modulesWithoutDependency = getTestedModulesWithoutDependency(modules);
if (modules.size() == modulesWithoutDependency.size()) {
boolean answer = showMissingCeylonTestDependencyDialog(project, modulesWithoutDependency);
if (answer) {
addCeylonTestImport(project, modulesWithoutDependency);
}
return answer;
}
return true;
}
private Set<Module> getTestedModules(ILaunchConfiguration config) throws CoreException {
Set<Module> modules = new HashSet<Module>();
List<CeylonTestLaunchConfigEntry> entries = CeylonTestLaunchConfigEntry.buildFromLaunchConfig(config);
for (CeylonTestLaunchConfigEntry entry : entries) {
IProject project = getProject(entry.getProjectName());
switch (entry.getType()) {
case PROJECT:
modules.addAll(getProjectDeclaredSourceModules(project));
break;
case MODULE:
Module module = getModule(project, entry.getModPkgDeclName());
modules.add(module);
break;
case PACKAGE:
Package pkg = getPackage(project, entry.getModPkgDeclName());
modules.add(pkg.getModule());
break;
case CLASS:
case CLASS_LOCAL:
case METHOD:
case METHOD_LOCAL:
String[] split = entry.getModPkgDeclName().split("::");
String pkgName = split[0];
Package pkg2 = getPackage(project, pkgName);
modules.add(pkg2.getModule());
break;
}
}
return modules;
}
private Set<Module> getTestedModulesWithoutDependency(Set<Module> modules) {
Set<Module> modulesWithoutCeylonTestImport = new HashSet<Module>();
for (Module module : modules) {
if( !containsCeylonTestImport(module) ) {
modulesWithoutCeylonTestImport.add(module);
}
}
return modulesWithoutCeylonTestImport;
}
private boolean showMissingCeylonTestDependencyDialog(final IProject project, final Set<Module> modulesWithoutDependency) {
final StringBuilder moduleNames = new StringBuilder();
moduleNames.append(System.getProperty("line.separator"));
for(Module module : modulesWithoutDependency) {
moduleNames.append(System.getProperty("line.separator"));
moduleNames.append(module.getNameAsString());
}
boolean answer = MessageDialog.openQuestion(getShell(),
CeylonTestMessages.errorDialogTitle,
CeylonTestMessages.errorMissingCeylonTestImport + moduleNames.toString());
return answer;
}
private void addCeylonTestImport(IProject project, Set<Module> modulesWithoutDependency) throws CoreException {
for (Module module : modulesWithoutDependency) {
AddCeylonTestImport.addCeylonTestImport(project, module);
}
}
}