eclipse-jdt / eclipse-jdt/eclipse.jdt.ui

`BuildpathIndicatorLabelDecorator` access the Java model before initialization

Open
#2,393 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.