Hello eclipse developers ,
I am a question for plugin developers of ‘org.eclipse.core.resources’ & ‘org.eclipse.ui.ide’.
I am facing following problem with the projects:
We are generating some projects programmatically at eclipse start-up based on some templates, including .project , and then close projects after generation.
Then if I open project A, it's natures are successfully applied from .project.
But if I leave closed the project B, then restart eclipse, and then open
project B, the natures are not applied. I have to close and reopen the
project B, and only then the natures are properly applied.
Based on the debug that I did in
'org.eclipse.core.resources' & 'org.eclipse.ui.ide' it seems to be by intention.
I found the cause of this problem and a potential fix but it implies to use restricted API.
The question is, if there is a better way to fix this?
I am working on eclipse oxygen 4.7.3
The projects are generated using general workflow:
IPath path = new Path(projectName);
IProject projectHandle
= ResourcesPlugin.getWorkspace().getRoot().getProject(path.lastSegment());
IPath projectLocation = Platform.getLocation().append(path);
IProjectDescription pDesc = ResourcesPlugin.getWorkspace().newProjectDescription(path.lastSegment());
projectHandle.create( pDesc , progressMonitor);
// and, by default, the project is not open after creation
If I open project now, same instance of IProjectDescription is used that I provided, that has natures, and it works as expected.
When projects are created for the first time they have the flag M_USED= false;
It reaches IDEWorkbenchActivityHelper.processProjects()
where natures ids array is not null, needsUpdates is true, and the natures are applied before the project is open.
But if I restart eclipse and open project B that never has been opened after creation, On open action, it also has the flag M_USED= false;
but this time, the project description instance is new and does not have required natures (ids = [empty] ; needsUpdate =false)
I close and reopen the project, now it has M_USED= true, and goes through different stacktrace that suppose to restore the project and to reload the natures, and thanks to that, second time, all natures
are applied. The (ids = [is not empty] ; needsUpdate = true)
.
Is it a bug that can be fixed, or It's an unusual case, and it is supposed that first time when project is created is has natures already, and not need to restore it ?
The only solution I found is to use restricted API, and force to set the flag M_USED right after project creation.
int M_USED = 0x10;
org.eclipse.core.internal.resources.ResourceInfo resinfo = ((org.eclipse.core.internal.resources.Project) projectHandle).getResourceInfo(false, true);