package org.archstudio.utils.eclipse;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IContributor;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionDelta;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IRegistryChangeEvent;
import org.eclipse.core.runtime.IRegistryChangeListener;
import org.eclipse.core.runtime.IRegistryEventListener;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.PDEExtensionRegistry;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
/**
* An interim wrapper for {@link PDEExtensionRegistry} until something better comes along... Methods are implemented as
* needed...
*/
@SuppressWarnings("restriction")
public class WorkspaceExtensionRegistry implements IExtensionRegistry {
PDEExtensionRegistry e = PDECore.getDefault().getExtensionsRegistry();
List<IRegistryEventListener> listeners = new CopyOnWriteArrayList<IRegistryEventListener>();
Multimap<String, IRegistryEventListener> extensionIdListeners = HashMultimap.create();
public WorkspaceExtensionRegistry() {
// necessary to initialize the registry
e.findExtensionPointPlugin("org.eclipse.pde.core.source");
e.addListener(new IRegistryChangeListener() {
@Override
public void registryChanged(IRegistryChangeEvent event) {
synchronized (extensionIdListeners) {
for (IExtensionDelta d : event.getExtensionDeltas()) {
switch (d.getKind()) {
case IExtensionDelta.ADDED:
for (IRegistryEventListener listener : extensionIdListeners.get(null)) {
listener.added(new IExtensionPoint[] { d.getExtensionPoint() });
}
for (IRegistryEventListener listener : extensionIdListeners.get(d.getExtensionPoint()
.getUniqueIdentifier())) {
listener.added(new IExtensionPoint[] { d.getExtensionPoint() });
}
break;
case IExtensionDelta.REMOVED:
for (IRegistryEventListener listener : extensionIdListeners.get(null)) {
listener.removed(new IExtensionPoint[] { d.getExtensionPoint() });
}
for (IRegistryEventListener listener : extensionIdListeners.get(d.getExtensionPoint()
.getUniqueIdentifier())) {
listener.removed(new IExtensionPoint[] { d.getExtensionPoint() });
}
break;
}
}
}
}
});
}
@Override
public void addRegistryChangeListener(IRegistryChangeListener listener, String namespace) {
throw new UnsupportedOperationException();
}
@Override
public void addRegistryChangeListener(IRegistryChangeListener listener) {
throw new UnsupportedOperationException();
}
@Override
public IConfigurationElement[] getConfigurationElementsFor(String extensionPointId) {
List<IConfigurationElement> configurationElements = Lists.newArrayList();
configurationElements.addAll(Arrays.asList(PDEUtils.getExtensionPoint(extensionPointId,
e.findExtensionPlugins(extensionPointId, true)).getConfigurationElements()));
return configurationElements.toArray(new IConfigurationElement[configurationElements.size()]);
}
@Override
public IConfigurationElement[] getConfigurationElementsFor(String namespace, String extensionPointName) {
return getConfigurationElementsFor(namespace + "." + extensionPointName);
}
@Override
public IConfigurationElement[] getConfigurationElementsFor(String namespace, String extensionPointName,
String extensionId) {
throw new UnsupportedOperationException();
}
@Override
public IExtension getExtension(String extensionId) {
throw new UnsupportedOperationException();
}
@Override
public IExtension getExtension(String extensionPointId, String extensionId) {
for (IExtension d : e.findExtensions(extensionPointId, true)) {
for (IConfigurationElement c : d.getConfigurationElements()) {
if (extensionId.equals(c.getAttribute("id"))) {
return d;
}
}
}
return null;
}
@Override
public IExtension getExtension(String namespace, String extensionPointName, String extensionId) {
throw new UnsupportedOperationException();
}
@Override
public IExtensionPoint getExtensionPoint(String extensionPointId) {
throw new UnsupportedOperationException();
}
@Override
public IExtensionPoint getExtensionPoint(String namespace, String extensionPointName) {
throw new UnsupportedOperationException();
}
@Override
public IExtensionPoint[] getExtensionPoints() {
throw new UnsupportedOperationException();
}
@Override
public IExtensionPoint[] getExtensionPoints(String namespace) {
throw new UnsupportedOperationException();
}
@Override
public IExtensionPoint[] getExtensionPoints(IContributor contributor) {
throw new UnsupportedOperationException();
}
@Override
public IExtension[] getExtensions(String namespace) {
throw new UnsupportedOperationException();
}
@Override
public IExtension[] getExtensions(IContributor contributor) {
throw new UnsupportedOperationException();
}
@Override
public String[] getNamespaces() {
throw new UnsupportedOperationException();
}
@Override
public void removeRegistryChangeListener(IRegistryChangeListener listener) {
throw new UnsupportedOperationException();
}
@Override
public boolean addContribution(InputStream is, IContributor contributor, boolean persist, String name,
ResourceBundle translationBundle, Object token) throws IllegalArgumentException {
throw new UnsupportedOperationException();
}
@Override
public boolean removeExtension(IExtension extension, Object token) throws IllegalArgumentException {
throw new UnsupportedOperationException();
}
@Override
public boolean removeExtensionPoint(IExtensionPoint extensionPoint, Object token) throws IllegalArgumentException {
throw new UnsupportedOperationException();
}
@Override
public void stop(Object token) throws IllegalArgumentException {
throw new UnsupportedOperationException();
}
@Override
public void addListener(IRegistryEventListener listener) {
synchronized (extensionIdListeners) {
extensionIdListeners.put(null, listener);
}
}
@Override
public void addListener(IRegistryEventListener listener, String extensionPointId) {
synchronized (extensionIdListeners) {
extensionIdListeners.put(extensionPointId, listener);
}
}
@Override
public void removeListener(IRegistryEventListener listener) {
throw new UnsupportedOperationException();
}
@Override
public boolean isMultiLanguage() {
throw new UnsupportedOperationException();
}
}