eclipse-jdt / eclipse-jdt/eclipse.jdt.ui
`BuildpathIndicatorLabelDecorator` access the Java model before initialization
- Dominant language
- Java
- Stars
- 59
- Forks
- 127
- Avg merge
- 23h 30m
- Merged PRs (30d)
- 35
Description
It happens that `BuildpathIndicatorLabelDecorator` acces the java model before the job `Initializing Java Tooling` has started (and finished).
This might lead to premature access to the java model (see for example https://github.com/eclipse-jdt/eclipse.jdt.ui/issues/2305 why it could be problematic)
The call stack is as follows:
```
| Worker-3: Decoration Calculation | 2025-07-30 12:17:08.865 | org.eclipse.pde.core | /debug/state | org.eclipse.pde.internal.core.RequiredPluginsInitializer | initialize | 39 | Thread Stack dump: java.lang.Throwable:
at org.eclipse.pde.internal.core.RequiredPluginsInitializer.initialize(RequiredPluginsInitializer.java:39)
at org.eclipse.jdt.internal.core.JavaModelManager.initializeContainer(JavaModelManager.java:3223)
at org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:2150)
at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:3982)
at org.eclipse.jdt.internal.core.JavaProject.resolveClasspath(JavaProject.java:3159)
at org.eclipse.jdt.internal.core.JavaProject.resolveClasspath(JavaProject.java:3323)
at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2437)
at org.eclipse.jdt.internal.core.JavaProject.findContainingClasspathEntry(JavaProject.java:2724)
at org.eclipse.jdt.internal.core.JavaProject.isOnClasspath(JavaProject.java:2708)
at org.eclipse.jdt.internal.ui.BuildpathIndicatorLabelDecorator.getOverlay(BuildpathIndicatorLabelDecorator.java:49)
at org.eclipse.jdt.internal.ui.BuildpathIndicatorLabelDecorator.decorate(BuildpathIndicatorLabelDecorator.java:35)
at org.eclipse.ui.internal.decorators.LightweightDecoratorDefinition.decorate(LightweightDecoratorDefinition.java:254)
at org.eclipse.ui.internal.decorators.LightweightDecoratorManager$LightweightRunnable.run(LightweightDecoratorManager.java:105)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
at org.eclipse.ui.internal.decorators.LightweightDecoratorManager.decorate(LightweightDecoratorManager.java:359)
at org.eclipse.ui.internal.decorators.LightweightDecoratorManager.getDecorations(LightweightDecoratorManager.java:345)
at org.eclipse.ui.internal.decorators.DecorationScheduler$1.queue(DecorationScheduler.java:410)
at org.eclipse.ui.internal.decorators.DecorationScheduler$1.run(DecorationScheduler.java:388)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
```
As this is in a job it does not block anything but it would be better to wait for the UI job to be triggered and done.
Contributor guide
Research direction
Start with org.eclipse.jdt.internal.ui.BuildpathIndicatorLabelDecorator, especially decorate and getOverlay, then trace the JavaProject.isOnClasspath call shown in the stack trace. Review how the Initializing Java Tooling job is triggered and completed. Done means decoration no longer accesses the Java model before that initialization has finished.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100