package org.xpect.ui.registry;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.InvalidRegistryObjectException;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
import org.xpect.registry.IExtensionInfo;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
public class UIExtensionInfoRegistry implements IExtensionInfo.Registry {
public static class UiExtensionInfo implements IExtensionInfo {
private final IConfigurationElement configurationElement;
public UiExtensionInfo(IConfigurationElement configurationElement) {
super();
this.configurationElement = configurationElement;
}
public Collection<String> getAttributes() {
return Lists.newArrayList(configurationElement.getAttributeNames());
}
public String getAttributeValue(String name) {
return configurationElement.getAttribute(name);
}
public Function<String, Class<?>> getClassLoader() {
return new Function<String, Class<?>>() {
public Class<?> apply(String input) {
try {
String bundleName = configurationElement.getContributor().getName();
Bundle bundle = Platform.getBundle(bundleName);
return bundle.loadClass(input);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (InvalidRegistryObjectException e) {
throw new RuntimeException(e);
}
}
};
}
public String getLocation() {
return configurationElement.getContributor().getName();
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("<");
result.append(configurationElement.getName());
List<String> attrs = Lists.newArrayList(getAttributes());
Collections.sort(attrs);
for (String attr : attrs) {
result.append(" ");
result.append(attr);
result.append("=\"");
result.append(getAttributeValue(attr));
result.append("\"");
}
result.append(" />");
return result.toString();
}
}
public Collection<String> getExtensionPoints() {
List<String> names = Lists.newArrayList();
for (IExtensionPoint ep : Platform.getExtensionRegistry().getExtensionPoints())
names.add(ep.getUniqueIdentifier());
return names;
}
public Collection<IExtensionInfo> getExtensions(String extensionPointName) {
List<IExtensionInfo> result = Lists.newArrayList();
for (IConfigurationElement cfg : Platform.getExtensionRegistry().getConfigurationElementsFor(extensionPointName))
result.add(new UiExtensionInfo(cfg));
return result;
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("<plugin>\n");
for (String point : getExtensionPoints()) {
result.append(" <extension point=\"");
result.append(point);
result.append("\">\n");
for (IExtensionInfo ext : getExtensions(point)) {
result.append(" ");
result.append(ext.toString());
result.append("\n");
}
}
result.append(" </extension>\n");
result.append("</plugin>");
return result.toString();
}
}