diff options
author | Eike Stepper | 2022-02-04 07:39:04 +0000 |
---|---|---|
committer | Eike Stepper | 2022-02-04 07:39:04 +0000 |
commit | 9e599b7dac00e470ab3ecf5138a32de4db266104 (patch) | |
tree | 083cd315a1d9983ab162111e4dee87cf84292abc | |
parent | 6ec8ba9669c5e8b163939efb08cf01bec60c1053 (diff) | |
download | cdo-9e599b7dac00e470ab3ecf5138a32de4db266104.tar.gz cdo-9e599b7dac00e470ab3ecf5138a32de4db266104.tar.xz cdo-9e599b7dac00e470ab3ecf5138a32de4db266104.zip |
[578573] NPE in IManagedContainer.getElementOrNull
https://bugs.eclipse.org/bugs/show_bug.cgi?id=578573
-rw-r--r-- | plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/container/PluginElementProcessorList.java | 72 |
1 files changed, 51 insertions, 21 deletions
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/container/PluginElementProcessorList.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/container/PluginElementProcessorList.java index f0d2a7b72c..8e45044a71 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/container/PluginElementProcessorList.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/container/PluginElementProcessorList.java @@ -12,8 +12,11 @@ package org.eclipse.net4j.internal.util.container; import org.eclipse.net4j.internal.util.bundle.OM; import org.eclipse.net4j.util.container.IElementProcessor; +import org.eclipse.net4j.util.container.IManagedContainer; import org.eclipse.net4j.util.lifecycle.Lifecycle; +import org.eclipse.core.runtime.IConfigurationElement; + import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -233,29 +236,10 @@ public class PluginElementProcessorList extends Lifecycle implements List<IEleme return; } - org.eclipse.core.runtime.IConfigurationElement[] elements = extensionRegistry.getConfigurationElementsFor(NAMESPACE, EXT_POINT); - for (org.eclipse.core.runtime.IConfigurationElement element : elements) + for (IConfigurationElement configurationElement : extensionRegistry.getConfigurationElementsFor(NAMESPACE, EXT_POINT)) { - IElementProcessor processor = (IElementProcessor)element.createExecutableExtension(ATTR_CLASS); - processors.add(processor); + processors.add(new ElementProcessorDescriptor(configurationElement)); } - - org.eclipse.core.runtime.IRegistryChangeListener listener = new org.eclipse.core.runtime.IRegistryChangeListener() - { - @Override - public void registryChanged(org.eclipse.core.runtime.IRegistryChangeEvent event) - { - org.eclipse.core.runtime.IExtensionDelta[] deltas = event.getExtensionDeltas(NAMESPACE, EXT_POINT); - for (org.eclipse.core.runtime.IExtensionDelta delta : deltas) - { - // TODO Handle ExtensionDelta - OM.LOG.warn("ExtensionDelta not handled: " + delta); //$NON-NLS-1$ - } - } - }; - - extensionRegistry.addRegistryChangeListener(listener, NAMESPACE); - extensionRegistryListener = listener; } private void doDeactivateOSGi() @@ -268,4 +252,50 @@ public class PluginElementProcessorList extends Lifecycle implements List<IEleme extensionRegistry.removeRegistryChangeListener((org.eclipse.core.runtime.IRegistryChangeListener)extensionRegistryListener); } + + /** + * A lazy descriptor for an {@link IElementProcessor element processor} that is declared in a plugin.xml. + * <p> + * <b>Note:</b> This level of indirection is required to delay class loading and plug-in activation that is triggered by + * IConfigurationElement.createExecutableExtension(). Upstream plug-ins may, as part of their legal activation process, + * call back down to PluginContainer, which is at this point still in its own activation process and has not initialized + * IPluginContainer.INSTANCE, yet. + * + * @author Eike Stepper + */ + private static final class ElementProcessorDescriptor implements IElementProcessor + { + private final IConfigurationElement configurationElement; + + private IElementProcessor delegate; + + public ElementProcessorDescriptor(IConfigurationElement configurationElement) + { + this.configurationElement = configurationElement; + } + + @Override + public Object process(IManagedContainer container, String productGroup, String factoryType, String description, Object element) + { + IElementProcessor elementProcessor = getElementProcessor(); + return elementProcessor.process(container, productGroup, factoryType, description, element); + } + + private synchronized IElementProcessor getElementProcessor() + { + if (delegate == null) + { + try + { + delegate = (IElementProcessor)configurationElement.createExecutableExtension(ATTR_CLASS); + } + catch (Exception ex) + { + OM.LOG.warn("A problem occured during element post processing", ex); //$NON-NLS-1$ + } + } + + return delegate; + } + } } |