blob: 39edc1d013c8da5373b8be35ab58e9c9091ce11a [file] [log] [blame]
package org.eclipse.dltk.testing;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.internal.testing.util.NumberUtils;
import org.eclipse.dltk.utils.NatureExtensionManager;
public final class TestingEngineManager extends
NatureExtensionManager<ITestingEngine> {
private static final String EXTENSION_POINT = DLTKTestingPlugin.PLUGIN_ID
+ ".engine"; //$NON-NLS-1$
private static class Descriptor {
final IConfigurationElement element;
final int priority;
/**
* @param confElement
* @param priority
*/
public Descriptor(IConfigurationElement confElement, int priority) {
this.element = confElement;
this.priority = priority;
}
}
private TestingEngineManager() {
super(EXTENSION_POINT, ITestingEngine.class);
}
private static final String PRIORITY_ATTR = "priority"; //$NON-NLS-1$
@Override
protected Object createDescriptor(IConfigurationElement confElement) {
final String strPriority = confElement.getAttribute(PRIORITY_ATTR);
int priority = NumberUtils.toInt(strPriority);
return new Descriptor(confElement, priority);
}
private final Comparator<Object> descriptorComparator = new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
Descriptor descriptor1 = (Descriptor) o1;
Descriptor descriptor2 = (Descriptor) o2;
return descriptor1.priority - descriptor2.priority;
}
};
@Override
protected void initializeDescriptors(List<Object> descriptors) {
Collections.sort(descriptors, descriptorComparator);
}
@Override
protected Object createInstanceByDescriptor(Object descriptor)
throws CoreException {
Descriptor engineDescriptor = (Descriptor) descriptor;
return super.createInstanceByDescriptor(engineDescriptor.element);
}
@Override
protected ITestingEngine[] createEmptyResult() {
return new ITestingEngine[0];
}
private static TestingEngineManager instance = null;
private static synchronized TestingEngineManager getInstance() {
if (instance == null) {
instance = new TestingEngineManager();
}
return instance;
}
public static ITestingEngine[] getEngines(String natureId) {
return getInstance().getInstances(natureId);
}
/**
* Returns the {@link ITestingEngine} with the specified engineId or
* <code>null</code>.
*
* @param engineId
* @return
*/
public static ITestingEngine getEngine(String engineId) {
if (engineId != null) {
final ITestingEngine[] engines = getInstance().getAllInstances();
for (int i = 0; i < engines.length; ++i) {
final ITestingEngine engine = engines[i];
if (engineId.equals(engine.getId())) {
return engine;
}
}
}
return null;
}
public static TestingEngineDetectResult detect(ITestingEngine[] engines,
ISourceModule module) {
IStatus infoStatus = null;
ITestingEngine infoEngine = null;
for (int i = 0; i < engines.length; i++) {
final ITestingEngine engine = engines[i];
final IStatus status = engine.validateSourceModule(module);
if (status != null) {
if (status.isOK()) {
return new TestingEngineDetectResult(engine, status);
} else if (status.getSeverity() == IStatus.INFO
&& infoStatus == null) {
infoStatus = status;
infoEngine = engine;
}
}
}
if (infoEngine != null) {
return new TestingEngineDetectResult(infoEngine, infoStatus);
} else {
return null;
}
}
}