Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2022-02-04 07:39:04 +0000
committerEike Stepper2022-02-04 07:39:04 +0000
commit9e599b7dac00e470ab3ecf5138a32de4db266104 (patch)
tree083cd315a1d9983ab162111e4dee87cf84292abc
parent6ec8ba9669c5e8b163939efb08cf01bec60c1053 (diff)
downloadcdo-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.java72
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;
+ }
+ }
}

Back to the top