Bug 93941

Summary: Classpath initialization on shutdown
Product: [Eclipse Project] JDT Reporter: Rafael Chaves <eclipse>
Component: CoreAssignee: Jerome Lanneluc <jerome_lanneluc>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: john.arthorne, Mike_Wilson, n.a.edgar, panagiotis.korros
Version: 3.1   
Target Milestone: 3.1 RC1   
Hardware: PC   
OS: Windows XP   
Whiteboard:

Description Rafael Chaves CLA 2005-05-06 11:57:33 EDT
Build: N20050506

If you startup a self-hosting workspace and then immediately shutdown, we found
that JDT core is doing classpath container initialization from within its save
participant.  It is not illegal for the save participant to be doing this during
shutdown, but presumably this case could be optimized to avoid container
initialization.

org.eclipse.core.internal.resources.Resource.touch(Resource.java:1401)
	at org.eclipse.core.internal.resources.Project.touch(Project.java:997)
	at
org.eclipse.jdt.internal.core.SetClasspathOperation.executeOperation(SetClasspathOperation.java:287)
	at
org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:718)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1717)
	at
org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:782)
	at org.eclipse.jdt.internal.core.JavaProject.setRawClasspath(JavaProject.java:2836)
	at org.eclipse.jdt.core.JavaCore$3.run(JavaCore.java:3845)
	at
org.eclipse.jdt.internal.core.BatchOperation.executeOperation(BatchOperation.java:39)
	at
org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:718)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1717)
	at org.eclipse.jdt.core.JavaCore.run(JavaCore.java:3654)
	at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:3828)
	at
org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize(JREContainerInitializer.java:54)
	at
org.eclipse.jdt.internal.core.JavaModelManager.initializeContainer(JavaModelManager.java:1421)
	at
org.eclipse.jdt.internal.core.JavaModelManager.initializeAllContainers(JavaModelManager.java:1381)
	at
org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:974)
	at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:1308)
	at
org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2062)
	at
org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1970)
	at
org.eclipse.jdt.internal.core.DeltaProcessingState.initializeRoots(DeltaProcessingState.java:269)
	at
org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:715)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1717)
	at org.eclipse.jdt.core.JavaCore.run(JavaCore.java:3654)
	at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:3828)
	at
org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize(JREContainerInitializer.java:54)
	at
org.eclipse.jdt.internal.core.JavaModelManager.initializeContainer(JavaModelManager.java:1421)
	at
org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:976)
	at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:1308)
	at
org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2062)
	at
org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1970)
	at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:3819)
	at
org.eclipse.pde.internal.core.SearchablePluginsManager.updateClasspathContainer(SearchablePluginsManager.java:175)
	at
org.eclipse.pde.internal.core.ExternalJavaSearchInitializer.initialize(ExternalJavaSearchInitializer.java:35)
	at
org.eclipse.jdt.internal.core.JavaModelManager.initializeContainer(JavaModelManager.java:1421)
	at
org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:976)
	at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:1308)
	at
org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2062)
	at
org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1970)
	at
org.eclipse.jdt.internal.core.search.JavaSearchScope.add(JavaSearchScope.java:108)
	at
org.eclipse.jdt.internal.core.search.JavaWorkspaceScope.initialize(JavaWorkspaceScope.java:96)
	at
org.eclipse.jdt.internal.core.search.JavaSearchScope.<init>(JavaSearchScope.java:62)
	at
org.eclipse.jdt.internal.core.search.JavaSearchScope.<init>(JavaSearchScope.java:58)
	at
org.eclipse.jdt.internal.core.search.JavaWorkspaceScope.<init>(JavaWorkspaceScope.java:42)
	at
org.eclipse.jdt.internal.core.search.JavaWorkspaceScope.createScope(JavaWorkspaceScope.java:37)
	at
org.eclipse.jdt.internal.core.search.BasicSearchEngine.createWorkspaceScope(BasicSearchEngine.java:157)
	at
org.eclipse.jdt.internal.core.search.indexing.IndexManager.cleanUpIndexes(IndexManager.java:100)
	at
org.eclipse.jdt.internal.core.JavaModelManager.saving(JavaModelManager.java:2013)
	at
org.eclipse.core.internal.resources.SaveManager.executeLifecycle(SaveManager.java:314)
	at org.eclipse.core.internal.resources.SaveManager$1.run(SaveManager.java:146)
	at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1031)
	at org.eclipse.core.runtime.Platform.run(Platform.java:757)
	at
org.eclipse.core.internal.resources.SaveManager.broadcastLifecycle(SaveManager.java:149)
	at org.eclipse.core.internal.resources.SaveManager.save(SaveManager.java:942)
	at org.eclipse.core.internal.resources.Workspace.save(Workspace.java:1752)
	at
org.eclipse.ui.internal.ide.IDEWorkbenchAdvisor$2.run(IDEWorkbenchAdvisor.java:291)
	at
org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:113)
Comment 1 Jerome Lanneluc CLA 2005-05-06 12:25:38 EDT
Is there any way that Platform can tell us it is a save during shutdown (and not
a save in the middle of the session) ?
Comment 2 John Arthorne CLA 2005-05-06 12:36:31 EDT
That's a good question.  IWorkspace#save is API, so anybody can call it any time
they want to.  In practice, the IDE Workbench only ever calls save once,
immediately before exiting the application.  In this case the UI knows it is
closing (IWorkbench.isClosing() returns true), but core doesn't know this. Is it
difficult to always avoid classpath initialization during a full save callback
(whenever JavaModelManager.saving is called)?
Comment 3 Jerome Lanneluc CLA 2005-05-12 07:02:23 EDT
*** Bug 93286 has been marked as a duplicate of this bug. ***
Comment 4 Jerome Lanneluc CLA 2005-05-18 06:31:55 EDT
*** Bug 95723 has been marked as a duplicate of this bug. ***
Comment 5 Jerome Lanneluc CLA 2005-05-19 08:46:01 EDT
Changed JavaModelManager#saving(...) to not cleanupIndexes if the workspace
scope has not been initialized. If the workspace scope is initialized, then all
containers will be initialized.

Added regression test ClasspathInitializerTests#testContainerInitializer11().
Comment 6 David Audel CLA 2005-05-27 07:11:50 EDT
Verified in i20050527-0010