package org.xpect.ui.junit.registry;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.pde.core.IModelChangeProvider;
import org.eclipse.pde.core.IModelChangedEvent;
import org.eclipse.pde.core.IModelChangedListener;
import org.eclipse.pde.core.plugin.IPluginAttribute;
import org.eclipse.pde.core.plugin.IPluginElement;
import org.eclipse.pde.core.plugin.IPluginExtension;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.IPluginObject;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.xpect.registry.ITestSuiteInfo;
import org.xpect.registry.LazyClass;
import org.xpect.registry.TestSuiteInfoRegistry.TestSuiteInfo;
import org.xpect.util.URIDelegationHandler;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
public class WorkspaceTestSuiteInfoRegistry implements ITestSuiteInfo.Registry, IModelChangedListener {
private Map<String, ITestSuiteInfo> extToInfo = null;
private List<IModelChangeProvider> listentingTo = Lists.newArrayList();
protected void collectSuites(IPluginModelBase model, Set<String> visited) {
if (!model.isEnabled())
return;
BundleDescription description = model.getBundleDescription();
if (!visited.add(description.getSymbolicName()))
return;
model.addModelChangedListener(this);
listentingTo.add(model);
for (IPluginExtension ext : model.getExtensions(true).getExtensions())
if ("org.xpect.testSuite".equals(ext.getPoint())) {
for (IPluginObject child : ext.getChildren()) {
if (child instanceof IPluginElement) {
IPluginElement pluginElement = (IPluginElement) child;
IPluginAttribute clazz = pluginElement.getAttribute("class");
IPluginAttribute fileExtension = pluginElement.getAttribute("fileExtension");
if (clazz != null && fileExtension != null) {
LazyClass<Object> lazyClass = LazyClass.create(Object.class, clazz.getValue(), (Function<String, Class<?>>) null);
TestSuiteInfo info = new TestSuiteInfo(lazyClass, Collections.singleton(fileExtension.getValue()));
this.extToInfo.put(fileExtension.getValue(), info);
}
}
}
}
for (BundleDescription desc : description.getDependents()) {
collectSuites(PluginRegistry.findModel(desc), visited);
}
}
protected void collectSuites() {
if (this.extToInfo == null) {
for (IModelChangeProvider provider : listentingTo)
provider.removeModelChangedListener(this);
listentingTo.clear();
this.extToInfo = Maps.newHashMap();
IPluginModelBase xpect = PluginRegistry.findModel("org.xpect");
collectSuites(xpect, Sets.<String> newHashSet());
}
}
public ITestSuiteInfo getTestSuite(Resource resource) {
collectSuites();
String fileExtension = new URIDelegationHandler().getOriginalFileExtension(resource.getURI().lastSegment());
return this.extToInfo.get(fileExtension);
}
public void modelChanged(IModelChangedEvent event) {
this.extToInfo = null;
}
}